首先,看服务端代码:
#include<unistd.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<signal.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
/*
int socket(int domain, int type, int protocol);
//man 2 bind
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//这个是通用协议结构,因为他们的大小都是相等的
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
//这个是具体的tcp协议结构,和上面的大小是一样的。只不过这个是具体的tcp协议。bind的时候,看你用的是什么样的协议
man 7 ip
struct sockaddr_in {
sa_family_t sin_family; // address family: AF_INET *
in_port_t sin_port; // port in network byte order *
struct in_addr sin_addr; // internet address *
};
// Internet address.结构化网络地址,可以用inet_addr("192.168.1.1")这个函数来转换成成员uint32_t
//也可以用inet_aton("192.168.1.1",inp)直接转换成结构体
struct in_addr {
uint32_t s_addr; // address in network byte order *
};
int listen(int sockfd, int backlog);
The backlog argument defines the maximum length to which the queue of pending connections for sockfd may
grow. If a connection request arrives when the queue is full, the client may receive an error with an
indication of ECON‐NREFUSED or, if the underlying protocol supports retransmission, the request may be
ignored so that a later reattempt at connection succeeds.
backlog参数定义sockfd的挂起连接队列可能增长到的最大长度。如果一个连接请求在队列满时到达,客户机可能会收到一个错误,并指示
连接拒绝,或者,如果基础协议支持重新传输,则可以忽略该请求,以便稍后重新尝试连接成功。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
*/
int main(){
int sockfd=0;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1){
perror("fun socket\n");
exit(0);
}
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(8001);
serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1"