進程間通信—Socket編程

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()創建了子進程來處理接受的數據,所以就成了一個一個服務器對多個客戶端,

可以同時運行多個服務器來發送數據。

程序運行結果:


我運行了兩個客戶端,可以同時收發數據。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章