Linux Socket 编程Server 端代码:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <pthread.h>
#include <time.h>
#define BUFFER_LENGTH 128
#define BACKLOG 10
int main()
{
int listenfd;//server 端 需要监听的 fd
int clientfd; // accept 获得的 客户端 fd
struct sockaddr_in servaddr;//IPV4的 socket 地址结构
struct sockaddr_in client;//IPV4的 socket 地址结构
socklen_t len;//地址结构的长度
int ret;//返回值
unsigned char buffer[BUFFER_LENGTH] = {0}; // 与缓冲区交互的用户空间的内存地址
listenfd = socket(AF_INET,SOCK_STREAM,0);// 创建server 端的socket
if(listenfd == -1)
{
printf("create socket error\n"); // 使用 perror最好
return -1;
}
//组装socket 地址结构
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);
// 绑定 IP 端口 这样 client 端就 知道 IP 端口信息就可以连接了
if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
{
return -2;
}
listen(listenfd,BACKLOG);//监听 等待 client连接
len = sizeof(client);
clientfd = accept(listenfd,(struct sockaddr* )&client,&len);
ret = recv(clientfd,buffer,BUFFER_LENGTH,0);
if(ret == 0 )
{
close(clientfd);
}
printf("buffer: %s,ret:%d\n",buffer,ret);
ret = send(clientfd,buffer,ret,0);
#Client 端代码(Client.c):
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <pthread.h>
#include <time.h>
#define BUFFER_LENGTH 128
#define msg "Hello from client"
int main()
{
int sockfd;//需要连接的sockfd
//int clientfd; // accept 获得的 客户端 fd
struct sockaddr_in servaddr;//IPV4的 socket 地址结构
socklen_t len;//地址结构的长度
int ret;//返回值
int recvbytes;//收到的字节数
unsigned char buffer[BUFFER_LENGTH] = {0}; // 与缓冲区交互的用户空间的内存地址
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
printf("create socket error!\n");
return -1;
}
//组装 server 端 地址信息
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);
int success = connect(sockfd,(struct sockaddr*)&servaddr,sizeof(struct sockaddr));
if(success == -1)
{
printf("connect error\n");
}
ret = send(sockfd,msg,sizeof(msg),0);
recvbytes= recv(sockfd,buffer,BUFFER_LENGTH,0);
buffer[recvbytes]='\0';
printf("received: %s\n",buffer);
close(sockfd);
}
实验结果
启动 server
./server
查看端口占用 9999 处于listen 状态等待客户端连接
netstat -anop | grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 11905/./server_1 off (0.00/0/0)
启动客户端
./client
received: Hello from client
server 端反应
buffer: Hello from client,ret:18
总结:如图
存在问题
- 客户端连接并且能够发送,另一个客户端能够建立链接但是不能发送。
- 当断开连接的时候,server 进程会循环 recv,并且返回值为0.
- 只能连接一次,不能再次连接。
请看下期
相关接口函数
socket
bind
listen
accept
文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:
服务器高级架构体系:https://ke.qq.com/course/417774?flowToken=1010783