php网站建设一流程,免费制作app平台,网站制作软件工程师,网站建设内容与结构目录 1 函数介绍
1.1 socket函数 与 通信域
1.2 bind函数 与 通信结构体
1.3 listen函数 与 accept函数
2 TCP服务端代码实现 3 TCP客户端代码实现
4 代码优化
5 练习 1 函数介绍
其中read、write、close在IO中已经介绍过#xff0c;只需了解socket、bind、listen、acc…目录 1 函数介绍
1.1 socket函数 与 通信域
1.2 bind函数 与 通信结构体
1.3 listen函数 与 accept函数
2 TCP服务端代码实现 3 TCP客户端代码实现
4 代码优化
5 练习 1 函数介绍
其中read、write、close在IO中已经介绍过只需了解socket、bind、listen、accept等
1.1 socket函数 与 通信域 #include sys/types.h
#include sys/socket.h
int socket(int domain, int type, int protocol);
参数
domain指定套接字的协议域protocol family可以是 AF_INETIPv4或 AF_INET6IPv6等。type指定套接字的类型可以是 SOCK_STREAM流套接字用于可靠的、面向连接的通信或 SOCK_DGRAM数据报套接字用于无连接的通信等。protocol指定使用的协议可以是 IPPROTO_TCPTCP或 IPPROTO_UDPUDP等。所以无需要指定协议设为0即可
返回值
成功创建套接字时返回一个非负整数代表新创建的套接字描述符。创建套接字失败时返回 -1并设置 errno 来表示具体的错误原因。 示例
#include sys/types.h
#include sys/socket.hint main() {int sockfd socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //最后一个参数也可以是0if (sockfd -1) {// 处理创建套接字失败的情况return -1;}// 套接字创建成功可以进行后续操作return 0;
}
1.2 bind函数 与 通信结构体
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);参数解释
sockfd要进行绑定的套接字描述符。addr指向sockaddr结构体的指针其中包含了要绑定的地址信息。addrlenaddr指向的结构体的大小。
返回值
成功时返回0。失败时返回-1并且在错误码中设置相应的错误标志可以通过errno全局变量获取具体错误信息。 ipv4结构体
struct sockaddr_in {sa_family_t sin_family; /* 地址族: AF_INET */in_port_t sin_port; /* 网络字节序的端口号 */struct in_addr sin_addr; /*IP地址结构体 */
};/* IP地址结构体 */
struct in_addr {uint32_t s_addr; /* 网络字节序的IP地址 */
};/*通用地址族结构体*/
struct sockaddr {sa_family_t sa_family;char sa_data[14];
}注意事项
调用bind()函数之前需要先创建一个套接字并确保该套接字是未绑定的。bind()函数通常在服务器端使用用于将服务器的套接字与指定的本地地址绑定从而监听并接收该地址发来的连接请求。在调用bind()函数时要根据实际情况提供正确的地址信息如IP地址和端口号等。在IPv4中地址信息存储在sockaddr_in结构体中而在IPv6中地址信息存储在sockaddr_in6结构体中。
示例强制转换
#include sys/types.h
#include sys/socket.h
#include netinet/in.hint main() {int sockfd;struct sockaddr_in server_addr;// 创建套接字sockfd socket(AF_INET, SOCK_STREAM, 0);// 设置服务器地址信息server_addr.sin_family AF_INET;server_addr.sin_port htons(8080);server_addr.sin_addr.s_addr INADDR_ANY;// 绑定套接字和地址if (bind(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)) -1) {perror(bind);return 1;}// 其他操作...return 0;
}1.3 listen函数 与 accept函数
/*监听套接字*/
int listen(int sockfd, int backlog);
参数
sockfd要监听的套接字描述符。backlog定义允许排队等待的连接请求的最大数量。
返回值
成功调用 listen() 函数时返回 0 表示成功。调用 listen() 函数失败时返回 -1 并设置 errno 来表示具体的错误原因。
函数功能 listen() 函数被用于 TCP 服务器端用于将指定的套接字标记为被动套接字passive socket开始监听传入的连接请求。在调用 listen() 之前服务器需要使用 socket() 函数创建一个套接字并使用 bind() 函数将套接字与特定的地址和端口绑定。
一旦套接字被标记为监听状态它就可以开始接受传入的连接请求。这些连接请求会被放置在一个连接请求队列中等待服务器进程使用 accept() 函数来接受这些请求并建立连接。
注意事项
backlog 参数指定了连接请求队列的最大长度。如果队列已满则新的连接请求将被拒绝。实际允许的队列长度可能会受到系统限制。在调用 listen() 之后通常需要调用 accept() 函数来接受连接请求并建立连接。
示例
#include sys/types.h
#include sys/socket.hint main() {int sockfd socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sockfd -1) {// 处理创建套接字失败的情况return -1;}// 套接字创建成功可以进行后续操作if (bind(sockfd, (struct sockaddr*)addr, sizeof(addr)) -1) {// 处理绑定地址和端口失败的情况return -1;}if (listen(sockfd, 10) -1) {// 处理监听套接字失败的情况return -1;}// 套接字处于监听状态可以接受连接请求并建立连接return 0;
} /*处理客户端发起的连接生成新的套接字*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
-sockfd: 函数socket生成的套接字
-addr:客户端的地址族信息
-addrlen:地址族结构体的长度
参数
sockfd监听套接字描述符即之前调用 listen() 函数返回的套接字描述符。addr指向用于存储客户端地址信息的结构体 sockaddr 的指针可以为 NULL。addrlen指向存储客户端地址长度的变量的指针如果 addr 不为 NULL则需要将 addrlen 设置为 sizeof(struct sockaddr)。
返回值
成功调用 accept() 函数时返回一个新的套接字描述符用于处理与客户端的连接。调用 accept() 函数失败时返回 -1 并设置 errno 来表示具体的错误原因。
函数功能 accept() 函数用于监听套接字上接受传入的连接请求并创建一个新的套接字来处理与客户端的连接。该新的套接字用于与客户端进行通信。在调用 accept() 函数之前需要先使用 socket()、bind() 和 listen() 函数来准备监听套接字。
当有一个连接请求到达监听套接字时accept() 函数会从连接请求队列中取出一个请求创建一个新的套接字来处理该连接并返回新创建的套接字描述符。可以通过新创建的套接字描述符进行与客户端的通信。
如果传入的 addr 不为 NULL则 accept() 函数会将客户端的地址信息存储在 addr 指向的结构体中。同时addrlen 也需要传入一个指向存储客户端地址长度的变量的指针。
注意事项
accept() 函数是一个阻塞调用当没有连接请求时它会一直等待直到有连接请求到达或出现错误才返回。通常在多线程或多进程环境中使用 accept() 函数来实现并发处理多个连接请求的功能。
示例
#include sys/types.h
#include sys/socket.hint main() {int sockfd socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sockfd -1) {// 处理创建套接字失败的情况return -1;}// 套接字创建成功可以进行后续操作if (bind(sockfd, (struct sockaddr*)addr, sizeof(addr)) -1) {// 处理绑定地址和端口失败的情况return -1;}if (listen(sockfd, 10) -1) {// 处理监听套接字失败的情况return -1;}// 套接字处于监听状态可以接受连接请求并建立连接struct sockaddr_in client_addr;socklen_t client_addrlen sizeof(client_addr);int client_sockfd accept(sockfd, (struct sockaddr*)client_addr, client_addrlen);if (client_sockfd -1) {// 处理接受连接请求失败的情况return -1;}// 成功接受连接请求可以使用 client_sockfd 进行与客户端的通信return 0;
}
2 TCP服务端代码实现
#include stdio.h
#include sys/socket.h
#include sys/types.h
#include stdlib.h
#include arpa/inet.h
#include unistd.h#define PORT 5001
#define BACKLOG 5int main(int argc, char *argv[])
{int fd, newfd;char buf[BUFSIZ] {}; //BUFSIZ 8142struct sockaddr_in addr;/*创建套接字*/fd socket(AF_INET, SOCK_STREAM, 0);if(fd 0){perror(socket);exit(0);}addr.sin_family AF_INET;addr.sin_port htons(PORT);addr.sin_addr.s_addr 0;/*绑定通信结构体*/if(bind(fd, (struct sockaddr *)addr, sizeof(addr) ) -1){perror(bind);exit(0);}/*设置套接字为监听模式*/if(listen(fd, BACKLOG) -1){perror(listen);exit(0);}/*接受客户端的连接请求生成新的用于和客户端通信的套接字*/newfd accept(fd, NULL, NULL);if(newfd 0){perror(accept);exit(0);}printf(BUFSIZ %d\n, BUFSIZ);read(newfd, buf, BUFSIZ);printf(buf %s\n, buf);close(fd);return 0;
} 3 TCP客户端代码实现
#include stdio.h
#include sys/socket.h
#include sys/types.h
#include stdlib.h
#include arpa/inet.h
#include unistd.h#define PORT 5001
#define BACKLOG 5
#define STR Hello World!int main(int argc, char *argv[])
{int fd;struct sockaddr_in addr;/*创建套接字*/fd socket(AF_INET, SOCK_STREAM, 0);if(fd 0){perror(socket);exit(0);}addr.sin_family AF_INET;addr.sin_port htons(PORT);addr.sin_addr.s_addr inet_addr(127.0.0.1);/*向服务端发起连接请求*/if(connect(fd, (struct sockaddr *)addr, sizeof(addr) ) -1){perror(connect);exit(0);}write(fd, STR, sizeof(STR) );printf(STR %s\n, STR);close(fd);return 0;
}4 代码优化
服务端
#include stdio.h
#include sys/socket.h
#include sys/types.h
#include stdlib.h
#include arpa/inet.h
#include unistd.h
#include string.h#define BACKLOG 5int main(int argc, char *argv[])
{int fd, newfd, ret;char buf[BUFSIZ] {}; //BUFSIZ 8142struct sockaddr_in addr;if(argc 3){fprintf(stderr, %saddrport\n, argv[0]);exit(0);}/*创建套接字*/fd socket(AF_INET, SOCK_STREAM, 0);if(fd 0){perror(socket);exit(0);}addr.sin_family AF_INET;addr.sin_port htons( atoi(argv[2]) );if ( inet_aton(argv[1], addr.sin_addr) 0) {fprintf(stderr, Invalid address\n);exit(EXIT_FAILURE);}/*绑定通信结构体*/if(bind(fd, (struct sockaddr *)addr, sizeof(addr) ) -1){perror(bind);exit(0);}/*设置套接字为监听模式*/if(listen(fd, BACKLOG) -1){perror(listen);exit(0);}/*接受客户端的连接请求生成新的用于和客户端通信的套接字*/newfd accept(fd, NULL, NULL);if(newfd 0){perror(accept);exit(0);}while(1){memset(buf, 0, BUFSIZ);ret read(newfd, buf, BUFSIZ);if(ret 0){perror(read);exit(0);}else if(ret 0)break;elseprintf(buf %s\n, buf);}close(newfd);close(fd);return 0;
}客户端
#include stdio.h
#include sys/socket.h
#include sys/types.h
#include stdlib.h
#include arpa/inet.h
#include unistd.h
#include string.h#define BACKLOG 5int main(int argc, char *argv[])
{int fd;struct sockaddr_in addr;char buf[BUFSIZ] {};if(argc 3){fprintf(stderr, %saddrport\n, argv[0]);exit(0);}/*创建套接字*/fd socket(AF_INET, SOCK_STREAM, 0);if(fd 0){perror(socket);exit(0);}addr.sin_family AF_INET;addr.sin_port htons( atoi(argv[2]) );if ( inet_aton(argv[1], addr.sin_addr) 0) {fprintf(stderr, Invalid address\n);exit(EXIT_FAILURE);}/*向服务端发起连接请求*/if(connect(fd, (struct sockaddr *)addr, sizeof(addr) ) -1){perror(connect);exit(0);}while(1){printf(Input-);fgets(buf, BUFSIZ, stdin);write(fd, buf, strlen(buf) );}close(fd);return 0;
}5 练习
实现TCP通信代码并使用Makefile进行编译。提交代码和完成通信的截图
client
#include stdio.h
#include sys/types.h
#include sys/socket.h
#include arpa/inet.h
#include string.h#define CLIENT_MAX_NUM 5int main(int argc, char * argv[])
{int clientfd;struct sockaddr_in server_addr;char buf[BUFSIZ];int ret;if( argc 3){printf(%s ip port\n,argv[0]);return 0;}clientfd socket(AF_INET, SOCK_STREAM,0);if(clientfd -1){perror(socket);return 0;}server_addr.sin_family AF_INET;server_addr.sin_port htons( atoi(argv[2]) ) ;if( inet_aton(argv[1], server_addr.sin_addr) 0){printf(Invalid address:%s\n,argv[1]);return 0;}if(connect(clientfd, (struct sockaddr *)server_addr,sizeof(server_addr)) -1){perror(connect);return 0;}while(1){printf();fgets(buf, BUFSIZ, stdin);write(clientfd, buf, strlen(buf));}close(clientfd);return 0;
}server
#include stdio.h
#include sys/types.h
#include sys/socket.h
#include arpa/inet.h
#include string.h#define CLIENT_MAX_NUM 5int main(int argc, char * argv[])
{int sockfd, clientfd;struct sockaddr_in server_addr;char buf[BUFSIZ];int ret;if( argc 3){printf(%s ip port\n,argv[0]);return 0;}sockfd socket(AF_INET, SOCK_STREAM,0);if(sockfd -1){perror(socket);return 0;}server_addr.sin_family AF_INET;server_addr.sin_port htons( atoi(argv[2]) ) ;if( inet_aton(argv[1], server_addr.sin_addr) 0){printf(Invalid address:%s\n,argv[1]);return 0;}if(bind(sockfd, (struct sockaddr *)server_addr,sizeof(server_addr)) -1){perror(bind);return 0;}if(listen(sockfd, CLIENT_MAX_NUM) -1){perror(listen);return 0;}clientfd accept(sockfd, NULL, NULL); if( clientfd -1){perror(accept);return 0;}while(1){memset(buf, 0, BUFSIZ);ret read(clientfd, buf, BUFSIZ);if(ret 0){perror(read);return 0;}else if( ret 0 ){break;}else{printf(buf %s\n, buf);} }close(clientfd);close(sockfd);return 0;
}makefile
CCgcc
CFLAGS-Wall
all:tcp_client tcp_serverclean:rm tcp_server tcp_client 文章转载自: http://www.morning.qjldz.cn.gov.cn.qjldz.cn http://www.morning.fplwz.cn.gov.cn.fplwz.cn http://www.morning.xpfwr.cn.gov.cn.xpfwr.cn http://www.morning.wbfly.cn.gov.cn.wbfly.cn http://www.morning.yymlk.cn.gov.cn.yymlk.cn http://www.morning.gnmhy.cn.gov.cn.gnmhy.cn http://www.morning.fnwny.cn.gov.cn.fnwny.cn http://www.morning.sflnx.cn.gov.cn.sflnx.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.jydhl.cn.gov.cn.jydhl.cn http://www.morning.fkyqm.cn.gov.cn.fkyqm.cn http://www.morning.lyhrg.cn.gov.cn.lyhrg.cn http://www.morning.fxpyt.cn.gov.cn.fxpyt.cn http://www.morning.jgrjj.cn.gov.cn.jgrjj.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.ymbqr.cn.gov.cn.ymbqr.cn http://www.morning.qhtlq.cn.gov.cn.qhtlq.cn http://www.morning.wflsk.cn.gov.cn.wflsk.cn http://www.morning.jjwt.cn.gov.cn.jjwt.cn http://www.morning.ogzjf.cn.gov.cn.ogzjf.cn http://www.morning.xbtlt.cn.gov.cn.xbtlt.cn http://www.morning.wpkr.cn.gov.cn.wpkr.cn http://www.morning.sbncr.cn.gov.cn.sbncr.cn http://www.morning.ylqb8.cn.gov.cn.ylqb8.cn http://www.morning.qgjxt.cn.gov.cn.qgjxt.cn http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn http://www.morning.yxlhz.cn.gov.cn.yxlhz.cn http://www.morning.gjcdr.cn.gov.cn.gjcdr.cn http://www.morning.rkqkb.cn.gov.cn.rkqkb.cn http://www.morning.qjlnh.cn.gov.cn.qjlnh.cn http://www.morning.htrzp.cn.gov.cn.htrzp.cn http://www.morning.gnzsd.cn.gov.cn.gnzsd.cn http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn http://www.morning.gjssk.cn.gov.cn.gjssk.cn http://www.morning.dpruuode.cn.gov.cn.dpruuode.cn http://www.morning.chkfp.cn.gov.cn.chkfp.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.wkkqw.cn.gov.cn.wkkqw.cn http://www.morning.jwpcj.cn.gov.cn.jwpcj.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.bssjz.cn.gov.cn.bssjz.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.kzslk.cn.gov.cn.kzslk.cn http://www.morning.jtcq.cn.gov.cn.jtcq.cn http://www.morning.jtqxs.cn.gov.cn.jtqxs.cn http://www.morning.lltdf.cn.gov.cn.lltdf.cn http://www.morning.bdgb.cn.gov.cn.bdgb.cn http://www.morning.qcrhb.cn.gov.cn.qcrhb.cn http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn http://www.morning.ndhxn.cn.gov.cn.ndhxn.cn http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn http://www.morning.wnbqy.cn.gov.cn.wnbqy.cn http://www.morning.qyllw.cn.gov.cn.qyllw.cn http://www.morning.ygpdm.cn.gov.cn.ygpdm.cn http://www.morning.tktyh.cn.gov.cn.tktyh.cn http://www.morning.pjxw.cn.gov.cn.pjxw.cn http://www.morning.yxnkr.cn.gov.cn.yxnkr.cn http://www.morning.mwlxk.cn.gov.cn.mwlxk.cn http://www.morning.rywn.cn.gov.cn.rywn.cn http://www.morning.rghkg.cn.gov.cn.rghkg.cn http://www.morning.mcwgn.cn.gov.cn.mcwgn.cn http://www.morning.gfqj.cn.gov.cn.gfqj.cn http://www.morning.fpryg.cn.gov.cn.fpryg.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.bxbkq.cn.gov.cn.bxbkq.cn http://www.morning.rglzy.cn.gov.cn.rglzy.cn http://www.morning.pmrlt.cn.gov.cn.pmrlt.cn http://www.morning.kdbbm.cn.gov.cn.kdbbm.cn http://www.morning.fslxc.cn.gov.cn.fslxc.cn http://www.morning.trffl.cn.gov.cn.trffl.cn http://www.morning.lxfdh.cn.gov.cn.lxfdh.cn http://www.morning.dwrbn.cn.gov.cn.dwrbn.cn http://www.morning.fpyll.cn.gov.cn.fpyll.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.mxtjl.cn.gov.cn.mxtjl.cn http://www.morning.fkgqn.cn.gov.cn.fkgqn.cn http://www.morning.yrycb.cn.gov.cn.yrycb.cn http://www.morning.qcztm.cn.gov.cn.qcztm.cn