linux下Socket编程的原理大家参考下面这篇博客:
http://blog.csdn.net/xiaoweige207/article/details/6211577
我就不多介绍了,下面这是一个小例子。
客户端代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/stat.h>
int main()
{
int fd,ret;
char buff[1024]={0};
struct sockaddr_in servaddr;
fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
perror("opening socket error");
return -1;
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
if(inet_pton(AF_INET,"192.168.7.92",&servaddr.sin_addr.s_addr)<=0)
{
perror("IP error");
return -2;
}
servaddr.sin_port=9000;
ret=connect(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(ret < 0)
{
perror("connecting error");
goto failed;
}
while(1)
{
printf("All ready,please enter the message....\n");
memset(buff,0,sizeof(buff));
if(fgets(buff,sizeof(buff)-1,stdin) == NULL)
{
perror("input error");
break;
}
ret=write(fd,buff,strlen(buff));
if(ret < 0)
{
perror("write to socket error");
break;
}
if((ret=read(fd,buff,sizeof(buff)-1))<0)
{
perror("reading error");
break;
}
if(ret == 0)
{
printf("Server disconnect...\n");
break;
}
printf("The message is:%s",buff);
}
failed:
close(fd);
return 0;
}
服务器端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/stat.h>
int main()
{
int fd,ret;
char buff[1024]={0};
struct sockaddr_in servaddr,clivaddr;
int len=sizeof(clivaddr);
fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
perror("opening socket error");
return -1;
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
if(inet_pton(AF_INET,"192.168.7.92",&servaddr.sin_addr.s_addr)<=0)
{
perror("IP error");
return -2;
}
servaddr.sin_port=9000;
ret=bind(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(ret < 0 )
{
perror("binding error");
goto failed;
}
if((ret=listen(fd,10) != 0))
{
perror("listening error");
goto failed;
}
int nsock;
while(1)
{
nsock=accept(fd,(struct sockaddr *)&clivaddr,&len);
if(nsock < 0)
{
perror("accept");
break;
}
else
{
printf("socket service starting...\n");
}
//ret=connect(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));
pid_t pid;
pid=fork();
if(pid == 0)
{
close(fd);
while(1)
{
memset(buff,0,sizeof(buff)-1);
ret=read(nsock,buff,sizeof(buff)-1);
if(ret < 0)
{
perror("reading error\n");
return -1;
}
ret=write(nsock,buff,strlen(buff));
if(ret < 0)
{
perror("write error\n");
return -2;
}
}
close(nsock);
exit(0);
}
close(nsock);
}
failed:
close(fd);
return 0;
}
运行时,首先运行服务器,
在客户端从键盘中循环读入数据,然后回车输出,
由于我用了fork()创建了子进程来处理接受的数据,所以就成了一个一个服务器对多个客户端,
可以同时运行多个服务器来发送数据。
程序运行结果:
我运行了两个客户端,可以同时收发数据。