Demonstrates MSG_OOB with select,send,recv calls. Use with BSD MSG_OOB sample client.
#include<stdio.h>
#include<sys/types.h>
#include<nlm/sys/socket.h>
#include<nlm/sys/bsdskt.h>
#include<netinet/in.h>
#include<unistd.h>
int NLM_Exiting = FALSE;
void main(void)
{
int serverSocket;
int clientSocket;
int sizeofClientAddr;
char buff[300];
struct sockaddr_in serverAddr, clientAddr;
struct timeval wait;
fd_set fds;
int i;
if(( serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == (-1)){
perror("socket");
goto END_ERR;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(2000);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(( bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr))) == (-1)){
perror("bind");
goto END_ERR;
}
if(( listen(serverSocket, 0)) == (-1)){
perror("listen");
goto END_ERR;
}
while(!NLM_Exiting)
{
sizeofClientAddr = sizeof(clientAddr);
if(( clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &sizeofClientAddr)) == (-1)){
perror("accept");
goto END_ERR;
}
FD_ZERO (&fds);
FD_SET (clientSocket, &fds);
wait.tv_sec = 0;
wait.tv_usec = 200;
i = select (2, 0, 0, &fds, &wait);
if(i != 1)
{
perror("select");
//printf("\r\nthis is errno = %d\r\n", errno);
}
else{
if(( recv(clientSocket, &buff, sizeof(buff), MSG_OOB)) == (-1)){
perror("recv");
goto END_ERR;
}
}
printf("recv: %s\r\n", buff);
if(( send(clientSocket, &buff, strlen(buff), MSG_OOB)) == (-1)){
perror("send");
goto END_ERR;
}
close(clientSocket);
}
END_ERR:
close(clientSocket);
close(serverSocket);
}
© 2008 Novell, Inc. All Rights Reserved.