用网络编程中socket编写服务器与客户端程序(TCP)

本文介绍了如何使用TCP协议进行网络编程,通过socket函数在服务器端完成创建、绑定、监听、接受连接及数据收发,而在客户端则涉及创建、连接服务器及数据交互,最后关闭网络连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

服务器程序:

1. 创建一个socket,用函数socket()

2. 绑定IP地址、端口等信息到socket上,用函数bind()

3.设置允许的最大连接数,用函数listen()

4.接收客户端上来的连接,用函数accept()

5.收发数据,用函数send()和recv(),或者read()和write()

6.关闭网络连接

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<pthread.h>
#define PORT 8000 
void *ClientHandler(void *arg)
{
	pthread_detach(pthread_self())  ;  //线程分离 
	int ret;
	int fd=*(int *)arg;
	char buf[32]={0};
	
	ret=recv(fd,buf,sizeof(buf),0);   //4个参数 
	if(-1==ret)
	{
		perror("recv");
	//	exit(1);
	}
	printf("recv from %d client %s!\n",fd,buf);
	memset(buf,0,sizeof(buf));
}

int main()
{
	int sockfd;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;	
	int fd[1000]={0},i=0;
	pthread_t tid; 
	sockfd=socket(PF_INET,SOCK_STREAM,0);    //创建socket ,有 3个参数
	if(-1==sockfd)     //若创建失败 
	{
	 	perror("socket");
	 	exit(1);
	} 
	  int length=sizeof(server_addr);
	  server_addr.sin_family=PF_INET;  //PF_INET 地址族
	  server_addr.sin_port= PORT;   //端口号
	  server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");   //ip地址  绑定什么连接什么地址 
	  int ret=bind(sockfd,(struct sockaddr *)&server_addr,length);    //绑定   ,强制类型转换 
	  if(-1==ret)
	  {
	  	perror("bind");
	  	exit(1);
	  }
	  ret=listen(sockfd,5);  //监听队列的大小
	  if(-1==ret)    //若监听失败 
	  {
	  	perror("listen");
	  	exit(1);
	   } 
	   while(1)  
	   {
	   		length=sizeof(client_addr);
	   		memset (&client_addr,0,sizeof(client_addr));
	   		fd[i]=accept(sockfd,(struct sockaddr *)&client_addr,&length);
	   		if(-1==ret)
	   		{
	   			perror("accept");
	   			exit(1);
		    }
		    printf("accept port %d fd %d\n",client_addr.sin_port,fd[i]);
		    ret=pthread_create(&tid,NULL,ClientHandler,&fd[i]) ;              //创建线程
			if(ret!=0)
			{
				perror("pthread_create");
			} 
			i++; 
		//	pthread_join();  //等待线程结束,回收资源 ,阻塞性函数,聊天室不能用。 卡死
		     
	   }
	return 0;
}

客户端程序:

1.创建一个socket,用函数socket()

2.设置要连接的对方的IP地址和端口等属性

3.连接服务器,用函数connect()

4.收发数据,用函数send()和recv(),或者     read()和write()

5.关闭网络连接 

 

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#define PORT 8000
int main()
{
	int sockfd,ret;
	char buf[32]={0};
	struct sockaddr_in server_addr;
	sockfd=socket(PF_INET,SOCK_STREAM,0); 
	if(sockfd==-1)
	{
		perror("socket");
		exit(1);
	}	
    int length=sizeof(server_addr);
	server_addr.sin_family=PF_INET;  //PF_INET 地址族
	server_addr.sin_port= PORT;   //端口号
	server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");   //ip地址  绑定什么连接什么地址 
	ret=connect (sockfd,(struct sockaddr *)&server_addr,length);
	if(-1==ret)
	{
		perror("connect");
		exit(1);
	}
	while(1)
	{
		scanf("%s",buf);
		ret=send(sockfd,buf,strlen(buf),0);
		if(-1==ret)
		{
			perror("send");
		}
		memset(buf,0,sizeof(buf));
	}
	return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值