基于socket的网络编程(实现服务器与客户端的互发消息)

基于socket的网络编程(实现服务器与客户端的互发消息)

服务器API解析

Socket() 申请一个套接字接口
Bind()为套接字添加信息(ip地址和端口号)
Listen()监听网络连接
Accept()监听到有客户端接入,接受一个连接
Read()读取数据
Write()发送数据
Close()关闭套接字,断开连接

客户端API解析
Socket() 申请一个套接字接口
connect()连接到服务器
Read()读取数据
Write()发送数据
Close()关闭套接字,断开连接

服务器代码

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>
int cfd;
void *fun(void *ftr)
{
	char writeBuf[128]={'\0'};
	char readBuf[128]={'\0'};
	int nread;
	int pid;

	while(1)
	{
		pid=fork();
		if(pid==0)
		{
			memset(readBuf,0,sizeof(readBuf));
			nread=read(cfd,readBuf,sizeof(readBuf));
			if(nread>0)
			{
				printf("get client msg: %s\n",readBuf);
			}
		}
		
		if(pid>0)
		{	
			memset(writeBuf,0,sizeof(readBuf));
			printf("Input:");
			scanf("%s",writeBuf);
			write(cfd,writeBuf,sizeof(writeBuf));
		}


	}
}
int main(int argc,char **argv)
{
	int sfd;
	int len;
	pthread_t t1;
	struct sockaddr_in caddr;
	struct sockaddr_in addr;

	memset(&addr,0,sizeof(struct sockaddr_in));
	memset(&caddr,0,sizeof(struct sockaddr_in));

	sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd==-1)
	{
		printf("create socket fail\n");
		perror("socket");
	}
	
	addr.sin_family=AF_INET;
	addr.sin_port=htons(atoi(argv[2]));
	inet_aton(argv[1],&addr.sin_addr);

	bind(sfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));

	listen(sfd,10);
	
	len=sizeof(struct sockaddr_in);
	while(1)
	{
		cfd=accept(sfd,(struct sockaddr *)&caddr,&len);
		printf("get ip:%s\n",inet_ntoa(caddr.sin_addr));
		pthread_create(&t1,NULL,fun,NULL);
	}
	
	close(sfd);
	close(cfd);
	return 0;
}

客户端代码

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>
int sfd;
void *fun(void *ftr)
{
	char writeBuf[128]={'\0'};
	char readBuf[128]={'\0'};
	int nread;
	int pid;

	while(1)
	{
		pid=fork();
		if(pid==0)
		{
			memset(writeBuf,0,sizeof(writeBuf));
			printf("Input:");
			scanf("%s",writeBuf);
			write(sfd,writeBuf,sizeof(writeBuf));
		}
		if(pid>0)
		{
			memset(readBuf,0,sizeof(writeBuf));
			nread=read(sfd,readBuf,sizeof(readBuf));
			if(nread>0)	
			{
				printf("get server msg:%s\n",readBuf);
			}
		}	
	}
}
int main(int argc,char **argv)
{
	pthread_t t1;
	struct sockaddr_in addr;

	memset(&addr,0,sizeof(struct sockaddr_in));

	sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd==-1)
	{
		printf("create socket fail\n");
		perror("socket");
	}
	
	addr.sin_family=AF_INET;
	addr.sin_port=htons(atoi(argv[2]));
	inet_aton(argv[1],&addr.sin_addr);

	connect(sfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
	
	pthread_create(&t1,NULL,fun,NULL);
	pthread_join(t1,NULL);
	
	close(sfd);
	return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Socket编程是一种网络编程技术,它可以实现客户端服务器之间的通信。在Socket编程中,客户端服务器通过套接字(Socket)建立连接,然后通过Socket发送和接收数据。 客户端服务器之间的通信可以分为两种方式:TCP和UDP。TCP是一种可靠的连接协议,它可以保证数据的可靠传输,但是速度较慢。UDP是一种不可靠的连接协议,它可以快速传输数据,但是数据的可靠性不如TCP。 在Socket编程中,客户端服务器需要分别创建一个Socket对象,然后通过Socket对象建立连接。客户端通过Socket对象向服务器发送数据,服务器通过Socket对象接收数据,并且可以向客户端发送数据。 Socket编程需要掌握网络编程的基础知识,包括IP地址、端口号、协议等。同时,还需要了解Socket编程的相关API,如socket()、bind()、listen()、accept()、connect()、send()、recv()等函数。 Socket编程可以应用于各种网络应用程序,如Web服务器、邮件服务器、聊天程序等。它是网络编程中的重要技术之一,对于网络程序员来说,掌握Socket编程是必不可少的。 ### 回答2: Socket编程是一种在计算机网络实现进程间通信的常用方式,可以用来实现客户端服务器之间的通信。实现Socket通信的核心在于建立连接,通过连接实现数据的发送和接收。下面,我们将从以下几个方面来说明Socket编程实现客户端服务器通信的过程: 一、建立连接 客户端服务器之间的连接可以采用TCP或UDP协议来建立。当采用TCP协议时,需要先建立三次握手,确保连接的可靠性,这会消耗一定的时间。而采用UDP协议则不需要建立连接,可以直接发送数据包,但是由于UDP协议不具备可靠性,可能会导致数据丢失或失序。 二、数据发送 在建立连接之后,客户端服务器之间可以进行数据的发送和接收。客户端在发送数据时,需要先创建一个套接字,调用send()函数发送数据。服务器端在接收数据时,则需要先创建一个套接字,调用recv()函数接收数据。在数据发送时,可以选择发送数据的大小,也可以选择分包发送。 三、数据接收 当客户端发送数据之后,服务器端会接收到数据。服务器端需要先创建一个套接字,然后监听并接收客户端发送的数据。在接收数据时,服务器端也可以选择一次性接收全部数据,也可以选择分批次接收数据。 通过以上步骤,就可以实现客户端服务器之间的通信。在实际应用中,还需要考虑多线程和多进程的应用,以提高系统的并发性能。同时,还需要加入安全措施,防止黑客攻击。总之,Socket编程是网络编程的基础,掌握Socket编程的方法和技巧,可以更好地实现客户端服务器之间的通信。 ### 回答3: Socket编程是一种基于网络通信的编程技术,其主要目的是实现客户端服务器之间的通信。在Socket编程中,客户端服务器之间通过Socket通信协议建立连接,进行数据传输和通信。 Socket编程实现客户端服务器通信的过程,通常包括以下几个步骤: 1. 创建Socket对象:客户端服务器都需要创建Socket对象来进行通信。客户端使用Socket对象来连接服务器服务器使用Socket对象来监听客户端请求并返回数据。 2. 连接服务器客户端通过Socket对象连接服务器,可以指定服务器的IP地址和端口号。服务器通过监听客户端请求,接收客户端请求信息。 3. 发送消息:客户端创建输出流,向服务器发送消息。服务器通过读取客户端发送的消息,处理请求,并返回响应数据。 4. 接收消息:服务器创建输入流,读取客户端发送的数据并处理请求。服务器通过输出流向客户端返回响应数据。 5. 关闭Socket连接:当通信结束时,客户端服务器均需关闭Socket连接。 Socket编程的实现方式多种多样,可以使用不同的编程语言和工具进行开发。例如,Java语言可以使用Java Socket API实现Socket编程,C++可以使用Winsock或Socket类库实现Socket编程,Python可以使用socket模块实现Socket编程等。 在实际应用中,Socket编程广泛应用于各种网络应用场景,如Web服务器、FTP服务器、邮件服务器等。通过Socket编程,可以实现高效、可靠的网络通信,为各种应用提供了强有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值