带外数据的问题,signal为何无法响应,麻烦各位.
/*客户端代码*、#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#define PORT 4000
#define MAXDATASIZE 100
int main(int argc,char *argv[])
{
int sock_fd,numbytes;
char buf;
struct hostent *he;
struct sockaddr_in their_addr;
if(argc!=2)
{
fprintf(stderr,"Usage:client hostname\n");
exit(1);
}
if((he=gethostbyname(argv))==NULL)
{
herror("gethostbyname");
exit(1);
}
if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(PORT);
their_addr.sin_addr=*((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero),8);
if(connect(sock_fd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
{
perror("connect");
exit(1);
}
if(send(sock_fd,"123",3,0)==-1)
{
perror("send");
close(sock_fd);
exit(0);
}
printf("send 3 byte of normal data\n");
sleep(1);
if(send(sock_fd,"4",1,MSG_OOB)==-1)
{
perror("send");
close(sock_fd);
exit(0);
}
printf("send 1 byte of OOB data\n");
sleep(1);
if(send(sock_fd,"56",2,0)==-1)
{
perror("send");
close(sock_fd);
exit(0);
}
printf("send 2 bytes of normal data\n");
sleep(1);
if(send(sock_fd,"7",1,MSG_OOB)==-1)
{
perror("send");
close(sock_fd);
exit(0);
}
printf("send 1 byte of OOB data\n");
sleep(1);
if(send(sock_fd,"89",2,MSG_OOB)==-1)
{
perror("send");
close(sock_fd);
exit(0);
}
printf("send 2 bytes of normal data\n");
sleep(1);
close(sock_fd);
return 0;
}
/*服务器端代码*、
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<signal.h>
#define MYPORT 4000
#define BACKLOG 10
void sig_urg(int new_fd);
int main(int argc,char *argv[])
{
int sock_fd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
int n;
char buff;
if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sock_fd,(struct sockaddr *)&(my_addr),sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sock_fd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
signal(SIGURG,sig_urg);
fcntl(sock_fd,F_SETOWN,getpid());
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sock_fd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("ACEPT");
continue;
}
printf("Server get connection from %s\n",inet_ntoa(*(struct in_addr *)&(their_addr.sin_addr)));
if(!fork())
while(1)
{
if((n=recv(new_fd,buff,sizeof(buff)-1,0))==0)
{
printf("received EOF\n");
break;
}
buff='\0';
printf("Recv %d Bytes %s\n",n,buff);
}
else
close(new_fd);
}
while(waitpid(-1,NULL,WNOHANG)>0);
signal(SIGURG,SIG_DFL);
return 0;
}
void sig_urg(int new_fd)
{
int n;
char buff;
printf("SIGURG received\n");
n=recv(new_fd,buff,sizeof(buff)-1,MSG_OOB);
buff='\0';
printf("recv %d OOB bytes:%s\n",n,buff);
}
页:
[1]