利用socket实现从服务器向客户端发现信息:
服务器端代码:
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
struct sockaddr_in my_addr,their_addr;
int sockfd,new_fd;
int ret;
char buffer[100];
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("socket error");
exit(0);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(9999);
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&(my_addr.sin_zero),8);
ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
if(ret<0)
{
printf("bind error");
exit(0);
}
ret=listen(sockfd,10);
if(ret<0)
{
printf("listen error");
exit(0);
}
while(1)
{
int sin_size=sizeof(struct sockaddr_in);
new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size);
if(new_fd<0)
{
printf("accept error");
exit(0);
}
if(!fork())
{
printf("server:got connect from %s\n",inet_ntoa (their_addr.sin_addr));
printf("input send data:");
if(gets(buffer)==NULL)
{
printf("input error");
exit(0);
}
if(send(new_fd,buffer,strlen(buffer),0)==-1)
{
printf("send error");
exit(0);
}
close(new_fd);
close(sockfd);
exit(0);
}
}
close(new_fd);
close(sockfd);
}
客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc,char *argv[])
{
int sockfd,numbytes;
char buf[100];
struct hostent *he;
struct sockaddr_in their_addr;
if(argc!=2)
{
printf("para error");
exit(0);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("socket error");
exit(0);
}
if((he=gethostbyname(argv[1]))==NULL)
{
printf("gethostname error");
exit(0);
}
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(9999);
their_addr.sin_addr=*((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
{
printf("connect error");
exit(0);
}
if((numbytes=recv(sockfd,buf,100,0))==-1)
{
printf("recv error");
exit(0);
}
buf[numbytes]='\0';
printf("Received:%s\n",buf);
close(sockfd);
return 0;
}