进程间通信—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()创建了子进程来处理接受的数据,所以就成了一个一个服务器对多个客户端,

可以同时运行多个服务器来发送数据。

程序运行结果:


我运行了两个客户端,可以同时收发数据。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值