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()創建了子進程來處理接受的數據,所以就成了一個一個服務器對多個客戶端,
可以同時運行多個服務器來發送數據。
程序運行結果:
我運行了兩個客戶端,可以同時收發數據。