回顾TCP网络编程;
工具:gcc + ubuntu;
ser端:
1.创建一个socket连接;
2.对sockaddr_in结构体初始化,保存建立的socket地址信息;
3.bind(),将本地ip地址绑定到端口号;
4.listen(),创建一个等待队列,将在其中存放未处理的cil端请求;
5.accept(),等待并处理客户端的连接请求;
6.建立连接后,使用send()或者recv()函数进行发送或者接收;
cil端:
1.创建一个socket连接;
2.调用connect()请求连接服务器,并对sockaddr_in相关参数设置;
3.使用recv()接收服务器消息;
更清晰的图解如下:(网上找到的)
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()
{
int sockfd = socket(PF_INET, SOCK_STREAM, 0);
assert(sockfd != -1);
struct sockaddr_in ser,cli;
memset(&ser, 0, sizeof(ser));
ser.sin_famliy = PF_INET;
ser.sin_port = htons(6000); //端口号(与服务器匹配)
ser.sin_addr.s_addr = inet_addr("127.0.0.1"); //回环地址
int c = connect(sockfd, (struct sockaddr *)&ser, sizeof(ser)); //向服务器发送连接请求
assert(c != -1);
while(1)
{
char buf[128] = {0};
fgets(buf, 128, stdin);
buf[strlen(buf) - 1] = 0;
send(sockfd, buf, strlen(buf), 0); //发送到服务器
char recvbuf[128] = {0};
recv(sockfd, recvbuf, 127, 0);
printf("%s\n", recvbuf);
if(strcmp(buf, "end") == 0)
break;
}
close(c);
return 0;
}
服务端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
int sockfd = socket(PF_INET, SOCK_STREAM, 0); //创建套接字
assert(sockfd != -1); //sockfd相当于描述符
struct sockaddr_in ser, cli;
memset(&ser, 0, sizeof(ser));
ser.sin_family = PF_INET; //协议族
ser.sin_port = htons(6000); //端口号
ser.sin_addr.s_addr = inet_addr("127.0.0.1"); //IP地址 //回环地址
int res = bind(sockfd, (struct sockaddr *)&ser, sizeof(ser)); //绑定
assert(res != -1);
listen(sockfd, 5); //启动监听
while(1) //服务器与客户端多次通讯
{
int len = sizeof(cli);
int c = accept(sockfd, (struct sockaddr *)&cli, &len); //返回本次连接到sockfd
if(c < 0)
continue;
while(1) //接受客户端发来的数据块
{
char recvbuf[128] = {0};
int n = recv(c, recvbuf, 127, 0);
if(n <= 0)
{
printf("one client break!\n");
break;
}
printf("%d %s\n",c, recvbuf);
send(c, "ok", 2, 0);
}
close(c); //关闭当前客户端的套接字
} //继续循环
close(sockfd); //关闭服务器
return 0;
}