赞
踩
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
- 1 创建socket
- int sockfd = socket(AF_INET, SOCK_STREAM, 0); //SOCK_STREAM tcp通信
-
- 2 绑定(bind)
- struct sockaddr_in myaddr;
- myaddr.sin_family = AF_INET;
- myaddr.sin_port = htons(8888);
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 自动提取本机ip地址
- bind(sockfd, (struct sockaddr *)&myaddr, sizeof(myaddr));
-
- 3 监听 (设置允许同时连接的客户端的最大值 同时连接:已经连上的,不算同时连接)
- int listen(int sockfd, int backlog);
- listen(sockfd, 5);
-
- 4 阻塞等待连接 accept
- int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- 参数:
- sockfd :socket 的返回值
- addr :客户端的ip地址和端口号存在addr中 (通常为NULL)//udp recvfrom倒数第二个参数一
- 样
- addrlen :客户端的ip地址和端口号长度 (通常为NULL)//udp recvfrom倒数第一个参数一样
- 返回值(重点)
- 是一个newfd :(一个新的fd,此fd用来标识客户端,第一个连接的 4,下一个5,....)
-
- 5 接收数据 (阻塞接收)
- ssize_t recv(int newfd, void *buf, size_t len, int flags);
- 参数: newfd accept的返回值, newfd
- buf 接收的数据存放的位置
- len 将要接收的数据的长度
- flags 暂时为0
- 返回值: 实际接收的数据的长度,如果<=0,则证明客户端已经断开连接
-
- 6 发送数据
- ssize_t send(int newfd, const void *buf, size_t len, int flags);
- 参数: newfd accept的返回值, newfd
- buf 发送数据首地址
- len 发送数据长度
- flags 暂时为0
- 返回值: 实际发送的数据的长度
-
- 7 关闭socket
- close(newfd);
- close(fd);
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- int main()
- {
- int fd = socket(AF_INET, SOCK_STREAM, 0);
-
- struct sockaddr_in myaddr;
- myaddr.sin_family = AF_INET;
- myaddr.sin_port = htons(8888);
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 得到当前计算机的ip地址
- int ret = bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr));
- printf("ret %d\n",ret);
-
- listen(fd, 5);
-
- int newfd = accept(fd, NULL, NULL); //等待客户端连接
-
- char buf[100] = { 0 };
- ret = recv(newfd, buf, sizeof(buf), 0); //newfd 代表连接的客户端
- printf("ret %d, newfd is %d, buf is %s\n",ret, newfd, buf);
-
- close(newfd);
- close(fd);
- }
- 1 创建socket
- int sockfd = socket(AF_INET, SOCK_STREAM, 0); //SOCK_STREAM tcp通信
-
- 2 连接服务端
- struct sockaddr_in youaddr;
- youaddr.sin_family = AF_INET;
- youaddr.sin_port = htons(8888);
- youaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
- int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 参数:
- sockfd socket的返回值
- addr 保存对方的ip地址和端口
- addrlen sizeof(youaddr);
- 返回值:成功 返回0 失败返回 -1
- 一旦连接成功,服务端解除阻塞(accpet)
-
- 3 发送数据
- ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- 参数:
- sockfd socket的返回值
- buf 发送的数据存放的位置,
- len 发送的数据的长度(以字节为单位)
- flags 暂时为0
-
- 4 接收数据 //同样用recv()
-
- 5 关闭socket
- close(fd);
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- int main()
- {
- int fd = socket(AF_INET, SOCK_STREAM, 0);
-
- struct sockaddr_in youaddr;
- youaddr.sin_family = AF_INET;
- youaddr.sin_port = htons(8888);
- youaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
-
- connect(fd, (struct sockaddr *)&youaddr, sizeof(youaddr));
-
- char buf[] = "hello";
- send(fd, buf, sizeof(buf), 0);
-
- close(fd);
- }
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- int main()
- {
- int fd = socket(AF_INET, SOCK_STREAM, 0);
- struct sockaddr_in myaddr;
- myaddr.sin_family = AF_INET;
- myaddr.sin_port = htons(8888);
- myaddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY 得到当前计算机的ip地址
- int ret = bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr));
- listen(fd, 5);
- int newfd = accept(fd, NULL, NULL); //等待客户端连接
- while(1)
- {
- char buf[100] = { 0 };
- if(recv(newfd, buf, sizeof(buf), 0) > 0) //newfd 代表连接的客户端
- printf("buf is %s\n", buf);
- else
- break;
- }
- close(fd);
- }
client.c (客户端)
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- int main(int argc, char *argv[])
- {
- int fd = socket(AF_INET, SOCK_STREAM, 0);
- struct sockaddr_in youaddr;
- youaddr.sin_family = AF_INET;
- youaddr.sin_port = htons(atoi(argv[2]));
- youaddr.sin_addr.s_addr = inet_addr(argv[1]);
- connect(fd, (struct sockaddr *)&youaddr, sizeof(youaddr));
- char buf[100] = "hello";
- while(1)
- {
- gets(buf);
- if (buf[0] =='0')
- {
- break;
- }
- send(fd, buf, sizeof(buf), 0);
- }
- close(fd);
- }
起两个终端一个执行服务器,一个执行客户端。
一个执行:gcc hello.c -o server ./server
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。