/*功能: 实现将客户端传来的小写字符串转化为大写,在传输会客户端
*测试方法1:
1)先 gcc server.c -o server
2)执行 ./server
3)在linux再起一个终端 输入命令 nc 127.0.0.1 6666 回车 //n代表net c代表connect
4)输入hello socket 回车
5)客户接收到服务端返回 HELLO SOCKET
*函数1: int socket(int domain, int type, int protocol);
参数: domain 通信地址族,AF_INET代表IPV4协议,AF_INET6代表IPV6协议(常用)
type SOCK_STREAM表示套接字使用TCP协议,SOCK_DGRAM表示套接字使用UDP协议(常用)
protocol 一般设置为0,表示使用默认协议
*函数2: htonl()和htons()作用是将本地字节序转换为网络字节序
注意:但是前提是只接收int型数据,如果是字符串类型转网络字节序则需要inet_pton()函数
网络字节序含义:由于网络协议规定数据格式为大端(低地址-高位)存储,而本地数据不一定是,所以在传输时需要转换
参数: INADDR_ANY是让系统自动获取当前IP,int型宏
*函数3: int bind(int sockfd, const struct socket sockaddr *addr, socklen_t addrlen);
用于绑定IP和端口,所以要传入含有IP和端口的结构体
*函数4: int listen(int sockfd,int backlog); backlog设置最大监听个数
*函数5: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //阻塞等待连接请求
客户端想要和服务端创建连接之前,先要完成三次握手机制,完成后加入连接队列,服务器调用accept()时从队列中
获取客户端信息,处理连接请求;如果连接队列为空时,accept()就会阻塞等待
参数: sockfd:注意这里的套接字是服务器创建的套接字
addr: 这个是一个传出参数,是客户端的地址结构体
addrlen:这个是一个传入传出参数,会根据结构体的的实际长度传出
return: accept()的返回值是一个套接字,该套接字用于本次通信的客户端进行数据交互
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h> //sockaddr_in 头文件
#include <stdlib.h>
#include <ctype.h> //toupper()头文件
#define SERV_PORT 6666 //不能大于65535, 1000一下的端口是系统使用
#define SERV_IP "127.0.0.1"
int main()
{
int lfd,cfd;
struct sockaddr_in serv_addr,clie_addr;
socklen_t clie_addr_len;
char buf[BUFSIZ]; //这里BUFSIZ是预定义的一个宏,可能是4k大小
int n,i;
lfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
if(lfd == -1)
{
printf("socket create failed\n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT); //将本地字节序转换为网络字节序,htons->host to network short short为16为的端口号
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); //绑定IP+端口,注意这里要强转
listen(lfd, 128); //默认最大连接数为128
clie_addr_len = sizeof(clie_addr);
cfd = accept(lfd, (struct sockaddr *)&clie_addr, &clie_addr_len);//clie_addr_len是传入 传出参数,所以不能直接sizeof传入,否则无法传出参数
while(1)
{
n = read(cfd, buf, sizeof(buf)); //n为实际读到的字节
for(i = 0; i < n; i++)
{
buf[i] = toupper(buf[i]); //将每个字符都转换为大写
}
write(cfd, buf, n); //将修改后的数据写回到客户端,注意不能是sizeof,必须是n个字节(接收的字节数)
}
close(lfd); //结束连接
close(cfd);
return 0;
}
在centos系统中,没有nc命令的话执行yum install -y nc 下载,其他系统请自查