#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netdb.h>
#define DEF_STD_ERROR (-1)
#define DEF_BIND_PORT (12455)
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#define BOOL int
#endif
//set socket(TRUE:block, FALSE:no block)
void set_block(int sock,BOOL flag)
{
int ret;
if(flag == TRUE)
{
ret = fcntl(sock,F_GETFL);
ret ^= O_NONBLOCK;
fcntl(sock,F_SETFL,ret);
}
else
{
ret = fcntl(sock,F_GETFL);
ret |= O_NONBLOCK;
fcntl(sock,F_SETFL,ret);
}
}
int main(int argc,char *argv[])
{
int ret;
int sock;
struct sockaddr_in addr;
pid_t child;
char buf[1024];
int len;
//create socket
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock == DEF_STD_ERROR)
{
printf("%s",strerror(errno));
return -1;
}
//init address
addr.sin_family = AF_INET;
addr.sin_port = htons(DEF_BIND_PORT);
addr.sin_addr.s_addr = inet_addr("192.168.1.127");
ret = bind(sock,(struct sockaddr*)&addr,sizeof(addr));
if(ret == DEF_STD_ERROR)
{
printf("%s",strerror(errno));
close(sock);
return -1;
}
//listen
ret = listen(sock,5);
if(ret == DEF_STD_ERROR)
{
printf("%s",strerror(errno));
close(sock);
return -1;
}
//set no block
set_block(sock,FALSE);
//accept
while(1)
{
ret = accept(sock,NULL,NULL);
if(ret == DEF_STD_ERROR)
{
if(errno == EAGAIN)
{
//printf("yi bu...\n");
usleep(10);
continue;
}
else
{
printf("%s",strerror(errno));
break;
}
}
//create child process
child =fork();
if(child < 0)
{
send(ret,"now busy,please wait for a moment!",sizeof("now busy,please wait for a moment!"),0);
close(ret);
printf("%s",strerror(errno));
continue;
}
else if(child == 0)
{
child = fork();
if(child == 0)
{
close(sock);
set_block(ret,FALSE);
while(1)
{
len = recv(ret,buf,sizeof(buf),0);
if(len == DEF_STD_ERROR)
{
if(errno == EAGAIN)
{
usleep(10);
continue;
}
else
{
printf("%s",strerror(errno));
break;
}
}
else if (len == 0)
{
printf("Peer common quit!\n");
break;
}
printf("sock[%d]:%s\n",ret,buf);
send(ret,buf,strlen(buf)+1,0);
}
close(ret);
exit(0);
}
else
{
close(ret);
close(sock);
exit(0);
}
}
else
{
waitpid(child,0,0);
close(ret);
}
}
//close
close(sock);
return 0;
}
套接字
最新推荐文章于 2023-11-27 11:51:53 发布