#include <stdio.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#define SERV_PORT 8888
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main()
{
int lfd = 0, cfd = 0;
int ret;
char buf[BUFSIZ], client_IP[1024];
//创建两个sockaddr_in结构体对象
struct sockaddr_in serv_addr, clit_addr; //serv_addr用来保存服务器地址结构
socklen_t clit_addr_len;
serv_addr.sin_family = AF_INET;//使用的IP类型
serv_addr.sin_port = htons(SERV_PORT);//将端口号从本地字节序转网络字节序
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//将IP地址从本地字节序转为网络字节序,INADDR_ANY表示从可用IP中任意选取可用IP
lfd = socket(AF_INET, SOCK_STREAM, 0);//创建一个用于listen的socket套接字
if(lfd == -1){
sys_err("socket error!");
}
bind(lfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr));//将lfd套接字与服务器绑定
listen(lfd,128);//设置监听上限为128
clit_addr_len = sizeof(clit_addr);//初始化clit_addr结构体的大小,准备accept()时传入
//阻塞接受客户端的连接请求,传入clit_addr_len
//accept结束后返回客户端的地址和端口号保存在clit_addr结构体中
//传出客户端地址结构体的实际长度clit_addr_len(如果传入的clit_addr为NULL,则表示不关心客户端的地址
cfd = accept(lfd,(struct sockaddr *)&clit_addr, &clit_addr_len);
//连接结束后,与客户端的通信就靠cfd套接字,lfd继续等待连接请求
if(cfd == -1)
sys_err("accept error");
//inet_ntop()函数:网络字节序转为本地字节序,从上面accept函数中传出的clit_addr中提取客户端的IP与端口号
printf("client ip:%s port:%d\n",inet_ntop(AF_INET, &clit_addr.sin_addr.s_addr, client_IP, sizeof(client_IP)),
ntohs(clit_addr.sin_port));
while(1){
ret = read(cfd, buf, sizeof(buf));//从客户端处读
write(STDOUT_FILENO, buf, ret);//输出在屏幕
for(int i = 0 ; i < ret; i++)
buf[i] = toupper(buf[i]);//将读取的内容进行处理
write(cfd, buf, ret);//写回客户端
}
close(lfd);
close(cfd);
return 0;
}
socket网络编程基础(服务器端C语言实现)
于 2022-02-17 12:00:58 首次发布
该博客详细展示了如何使用C语言实现一个简单的TCP/IP服务器,包括创建socket、绑定端口、监听连接、接收并处理客户端数据,以及将处理后的数据回传给客户端的过程。主要涉及网络编程和socket接口相关知识。
摘要由CSDN通过智能技术生成