服务器端代码:
#include<t_stdio.h>
#include<sys/types.h>
#include <sys/socket.h>
#include<arpa/inet.h>
#include <sys/socket.h>
#include<ctype.h>
#include<unistd.h>
int main(void){
struct sockaddr_in serv,cli;
socklen_t cli_len;
char buf[128];
char IP[32];
//创建一个通讯端点,返回该端点的文件描述符
//创建一个ipv4的tcp连接端口
int s_fd=socket( AF_INET ,SOCK_STREAM ,0);
//需要对server变量成员初始化
serv.sin_family=AF_INET;
serv.sin_port=htons(5556);
serv.sin_addr.s_addr=htonl(INADDR_ANY);
//将s_fd和本地地址,端口号绑定
int b=bind(s_fd,(struct sockaddr *)&serv,sizeof(serv));
if(b==-1)E_MSG("bind",-1);
if(s_fd==-1)E_MSG("socket",-1);
//将s_fd设置为被动连接,监听客户端连接的到来
//将客户端到来的连接放入未决连接队列中
//指定未决连接队列的长度
listen(s_fd,5);
while(1){
//从s_fd设备的未连接队列中提取一个进程进行处理
//返回一个连接描述符,使用这个连接描述符与客户端进行通讯
int c_fd=accept(s_fd,(struct sockaddr *)&cli,&cli_len);
if(c_fd==-1)E_MSG("accept",-1);
//binary--->text
inet_ntop(AF_INET,&cli.sin_addr,IP,32);
printf("client ip: %s\n",IP);
//代码执行到这里,三次握手以及完成,可以进行数据传输了
//从c_fd中读取客户端发送过来的请求信息
int r = read(c_fd,buf,128);
//处理客户端的请求信息
int i;
for(i=0;i<r;i++){
buf[i]=toupper(buf[i]);
}
//将处理结果回送客户端
write(c_fd,buf,r);
//关闭本次连接
close(c_fd);
}
return 0;
}
客户端代码:
#include<t_stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char * argv[]){
struct sockaddr_in serv;
char * msg="this is a test..\n";
char buf[128];
//创建socket设备,返回该设备的文件描述符
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd==-1)E_MSG("socket",-1);
//服务器信息初始化
serv.sin_family=AF_INET;
serv.sin_port=htons(5556);
//127.0.0.1 text-->binary
inet_pton(AF_INET,argv[1],&serv.sin_addr);
// 向服务器发起连接
int c=connect(fd,(struct sockaddr *)&serv,sizeof(serv));
if(c==-1)E_MSG("connect",-1);
//三次握手成功,向服务器发送请求信息
write(fd,msg,strlen(msg)+1);
//阻塞等待服务器回应
int r=read(fd,buf,128);
//将相应信息输出到显示器
write(1,buf,r);
//关闭连接
close(fd);
return 0;
}
标签:serv,int,编程,TCP,实例,fd,include,连接,客户端 From: https://blog.csdn.net/weixin_73951752/article/details/137202200解析:
- 在服务器端,首先创建了一个
socket
设备,用于建立网络连接。- 使用
bind
函数,将socket
设备与特定的网络地址和端口号绑定。在这里,地址被设为INADDR_ANY
,表示该服务器可接受任意网络中的请求,端口号被设为5556
。- 调用
listen
函数,使得该socket
设备成为一个被动连接的设备,等待客户端的连接请求。该函数的第二个参数5
,表示最多可以维护5个客户端的连接请求。- 在一个无限循环中,使用
accept
函数,从设备的未接连接队列中取出一个连接进行处理。返回的c_fd
是用来和客户端进行通信的连接描述符。- 在接收到客户端连接之后,获取客户端的IP地址,打印到控制台。
- 使用
read
函数,读取c_fd中客户端发送过来的请求信息。- 然后对客户端发送来的字符,从小写转换为大写。
- 使用
write
函数,将被转换为大写的字符回送给客户端。- 传输完毕后,使用
close
函数关闭本次连接。- 客户端也首先创建一个
socket
设备。- 初始化服务器端的信息,包括网络协议、端口和服务器IP地址。
- 调用
connect
函数向服务器发起连接。- 发起连接后,使用
write
函数向服务器发送请求信息,这里请求的信息为 "this is a test.."- 使用
read
函数等待服务器的回应。- 最后将收到的回应信息输出到显示器,并关闭连接。