linux socket

下面介绍socket实现通信的例子,客户端socket client和服务端socket server

socket server代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/socket.h>
#include<linux/in.h>
#include<arpa/inet.h>
#include<signal.h>
#define PORT 8888
#define BACKLOG 5

void process_conn_server(int s){
	char buffer[1024];
	ssize_t size=0;
	char strs[7]="server:";
	for(;;){
		size=recv(s,buffer,1024,0);
		if(size>0){	
			sprintf(buffer,"%d bytes together",size);
			write(1,buffer,size);	//write to standard output
			send(s,strs,strlen(strs)+1,0);
			send(s,buffer,strlen(buffer)+1,0);
		}
	}
}
int main(int argc,char *argv[]){
	printf("hello,wlcome to server!");
	int ss,sc;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	int err;
	pid_t pid;

//	bzero(&server_addr,sizeof(struct sockaddr_in));
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(PORT);
//	server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	bzero(&(server_addr.sin_zero),8);

	ss=socket(AF_INET,SOCK_STREAM,0);
	if(ss<0){
		printf("socket error !");
		return -1;
	}
	
	err=bind(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
	if(err<0){
		printf("bind error !");
		return -1;
	}
	err=listen(ss,BACKLOG);
	if(err<0){
                printf("listen error !");
		return -1;
        }
	printf("start accept:");
	while(1){
		printf("wait for connection:");
		int addr_len=sizeof(struct sockaddr);
		sc=accept(ss,(struct sockaddr*)&client_addr,&addr_len);
		if(sc<0){
			continue;
		}
		printf("start a connection successfully !");
		pid=fork();
		if(pid==0){
		//	close(ss);
			printf("child pid:");
			process_conn_server(sc);
		}else if(pid>0){
		//	close(sc);
			printf("parent pid !");
		//	process_conn_server(sc);
		}else{
			printf("fork pid failed !");
			break;
		}	
//		process_conn_server(sc);
	}	
//	process_conn_server(sc);
	return 0;
}


socket client代码如下:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
//#include<linux/in.h>
#include<netinet/in.h>
#include<signal.h>
#define PORT 8888
static int s;
void sig_process_client(int signo){
	printf("\nCatch a exit signal !\n");
	close(s);
	exit(0);
}
void process_conn_client(int ss){
	ssize_t size=0;
	ssize_t count=0;
	char buffer[1024];
	char temp[1024];
	char src[5]="From:";
	for(;;){
		/*read data from  standard input and stored in buffer*/
		size=read(0,buffer,1024);
		
	//	count=recv(ss,temp,1024,0);
	/*	if(count>0){	
			send(ss,src,strlen(src)+1,0);
		}	*/
		if(size>0){
		//	sprintf(buffer,"%d bytes together !",size);
		//	write(ss,buffer,size);
			send(ss,buffer,size,0);

			count=recv(ss,temp,1024,0);
			write(1,temp,count);	/*write to standard output*/
			printf("\n");
		}
	}
}

int main(int argc,char *argv[]){
	struct sockaddr_in server_addr;	
//	if(argc==1){
//		printf("Please input server address:\n");
//		return 0;
//	}
	signal(SIGINT,sig_process_client);
	s=socket(AF_INET,SOCK_STREAM,0);
	if(s<0){
		printf("socket error !");
	}
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(PORT);
//	server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//	inet_pton(AF_INET,argv[1],&server_addr.sin_addr);
	bzero(&(server_addr.sin_zero),8);

	connect(s,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
	process_conn_client(s);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值