赞
踩
int socket(int af, int type, int protocol);
int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
int bind(int sock, struct sockaddr *addr, socklen_t addrlen);
/* 创建服务端socket */
int ServerSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
/* 设置服务端信息 */
struct sockaddr_in ServerSockAddr;
memset(&ServerSockAddr, 0, sizeof(ServerSockAddr));
// 给结构体ServerSockAddr清零
ServerSockAddr.sin_family = PF_INET;
// 使用IPv4地址
ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 本机IP地址
ServerSockAddr.sin_port = htons(1314); // 端口
/* 绑定套接字 */
bind(ServerSock, (SOCKADDR*)&ServerSockAddr, sizeof(SOCKADDR));
struct sockaddr_in6 {
sa_family_t sin6_family; // 地址类型,取值为AF_INET6
in_port_t sin6_port; // 16位端口号
uint32_t sin6_flowinfo; // IPv6流信息
struct in6_addr sin6_addr; // 具体的IPv6地址
uint32_t sin6_scope_id; // 接口范围ID
};
int connect(int sock, struct sockaddr *serv_addr, socklen_t addrlen);
int ClientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(ClientSock, (SOCKADDR*)&ServerSockAddr, sizeof(SOCKADDR));
int listen(int sock, int backlog);
/* 进入监听状态 */
listen(ServerSock, 10);
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
/* 监听客户端请求,accept函数返回一个新的套接字,发送和接收都是用这个套接字 */
int ClientSock = accept(ServerSock, (SOCKADDR*)&ClientAddr, &len);
int close(int fd);
close(ServerSock);
read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recvfrom(int sock, void *buf, size_t nbytes, int flags, struct sockadr *from, socklen_t *addrlen);
ssize_t sendto(int sock, void *buf, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrlen);
SOCKET socket(int af, int type, int protocol);
int bind(SOCKET sock, const struct sockaddr *addr, int addrlen);
int connect(SOCKET sock, const struct sockaddr *serv_addr, int addrlen);
int listen(SOCKET sock, int backlog);
SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen);
int closesocket( SOCKET s);
int send(SOCKET sock, const char *buf, int len, int flags);
int recv(SOCKET sock, char *buf, int len, int flags);
int recvfrom(SOCKET sock, char *buf, int nbytes, int flags, const struct sockaddr *from, int *addrlen);
int sendto(SOCKET sock, const char *buf, int nbytes, int flags, const struct sockadr *to, int addrlen);
#include <stdio.h> #include <winsock2.h> #define BUF_LEN 100 int main(void) { WSADATA wd; SOCKET ServerSock, ClientSock; char Buf[BUF_LEN] = {0}; SOCKADDR ClientAddr; SOCKADDR_IN ServerSockAddr; int addr_size = 0, recv_len = 0; /* 初始化操作sock需要的DLL */ WSAStartup(MAKEWORD(2,2),&wd); /* 创建服务端socket */ if (-1 == (ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) { printf("socket error!\n"); exit(1); } /* 设置服务端信息 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); // 给结构体ServerSockAddr清零 ServerSockAddr.sin_family = AF_INET; // 使用IPv4地址 ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");// 本机IP地址 ServerSockAddr.sin_port = htons(1314); // 端口 /* 绑定套接字 */ if (-1 == bind(ServerSock, (SOCKADDR*)&ServerSockAddr, sizeof(SOCKADDR))) { printf("bind error!\n"); exit(1); } /* 进入监听状态 */ if (-1 == listen(ServerSock, 10)) { printf("listen error!\n"); exit(1); } addr_size = sizeof(SOCKADDR); while (1) { /* 监听客户端请求,accept函数返回一个新的套接字,发送和接收都是用这个套接字 */ if (-1 == (ClientSock = accept(ServerSock, (SOCKADDR*)&ClientAddr, &addr_size))) { printf("socket error!\n"); exit(1); } /* 接受客户端的返回数据 */ int recv_len = recv(ClientSock, Buf, BUF_LEN, 0); printf("客户端发送过来的数据为:%s\n", Buf); /* 发送数据到客户端 */ send(ClientSock, Buf, recv_len, 0); /* 关闭客户端套接字 */ closesocket(ClientSock); /* 清空缓冲区 */ memset(Buf, 0, BUF_LEN); } /*如果有退出循环的条件,这里还需要清除对socket库的使用*/ /* 关闭服务端套接字 */ //closesocket(ServerSock); /* WSACleanup();*/ return 0; }
#include <stdio.h> #include <winsock2.h> #define BUF_LEN 100 int main(void) { WSADATA wd; SOCKET ClientSock; char Buf[BUF_LEN] = {0}; SOCKADDR_IN ServerSockAddr; /* 初始化操作sock需要的DLL */ WSAStartup(MAKEWORD(2,2),&wd); /* 向服务器发起请求 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); ServerSockAddr.sin_family = AF_INET; ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ServerSockAddr.sin_port = htons(1314); while (1) { /* 创建客户端socket */ if (-1 == (ClientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) { printf("socket error!\n"); exit(1); } if (-1 == connect(ClientSock, (SOCKADDR*)&ServerSockAddr, sizeof(SOCKADDR))) { printf("connect error!\n"); exit(1); } printf("请输入一个字符串,发送给服务端:"); gets(Buf); /* 发送数据到服务端 */ send(ClientSock, Buf, strlen(Buf), 0); /* 接受服务端的返回数据 */ recv(ClientSock, Buf, BUF_LEN, 0); printf("服务端发送过来的数据为:%s\n", Buf); memset(Buf, 0, BUF_LEN); // 重置缓冲区 closesocket(ClientSock); // 关闭套接字 } // WSACleanup(); /*如果有退出循环的条件,这里还需要清除对socket库的使用*/ return 0; }
gcc tcp_client.c -o tcp_client.exe -lwsock32
gcc tcp_server.c -o tcp_server.exe -lwsock32
// tcp_server
客户端发送过来的数据为:hello
客户端发送过来的数据为:5201314
// tcp_client
请输入一个字符串,发送给服务端:hello
服务端发送过来的数据为:hello
请输入一个字符串,发送给服务端:5201314
服务端发送过来的数据为:5201314
请输入一个字符串,发送给服务端:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #define BUF_LEN 100 int main(void) { int ServerFd, ClientFd; char Buf[BUF_LEN] = {0}; struct sockaddr ClientAddr; int addr_len = 0, recv_len = 0; struct sockaddr_in ServerSockAddr; int optval = 1; /* 创建服务端文件描述符 */ if (-1 == (ServerFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) { printf("socket error!\n"); exit(1); } /* 设置服务端信息 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); // 给结构体ServerSockAddr清零 ServerSockAddr.sin_family = AF_INET; // 使用IPv4地址 ServerSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 自动获取IP地址 ServerSockAddr.sin_port = htons(6666); // 端口 // 设置地址和端口号可以重复使用 if (setsockopt(ServerFd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { printf("setsockopt error!\n"); exit(1); } /* 绑定操作,绑定前加上上面的socket属性可重复使用地址 */ if (-1 == bind(ServerFd, (struct sockaddr*)&ServerSockAddr, sizeof(struct sockaddr))) { printf("bind error!\n"); exit(1); } /* 进入监听状态 */ if (-1 == (listen(ServerFd, 10))) { printf("listen error!\n"); exit(1); } addr_len = sizeof(struct sockaddr); while (1) { /* 监听客户端请求,accept函数返回一个新的套接字,发送和接收都是用这个套接字 */ if (-1 == (ClientFd = accept(ServerFd, (struct sockaddr*)&ClientAddr, &addr_len))) { printf("accept error!\n"); exit(1); } /* 接受客户端的返回数据 */ if ((recv_len = recv(ClientFd, Buf, BUF_LEN, 0)) < 0) { printf("recv error!\n"); exit(1); } printf("客户端发送过来的数据为:%s\n", Buf); /* 发送数据到客户端 */ send(ClientFd, Buf, recv_len, 0); /* 关闭客户端套接字 */ close(ClientFd); /* 清空缓冲区 */ memset(Buf, 0, BUF_LEN); } return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define BUF_LEN 100 int main(void) { int ClientFd; char Buf[BUF_LEN] = {0}; struct sockaddr_in ServerSockAddr; /* 向服务器发起请求 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); ServerSockAddr.sin_family = AF_INET; ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ServerSockAddr.sin_port = htons(6666); while (1) { /* 创建客户端socket */ if (-1 == (ClientFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) { printf("socket error!\n"); exit(1); } /* 连接 */ if (-1 == connect(ClientFd, (struct sockaddr*)&ServerSockAddr, sizeof(ServerSockAddr))) { printf("connect error!\n"); exit(1); } printf("请输入一个字符串,发送给服务端:"); gets(Buf); /* 发送数据到服务端 */ send(ClientFd, Buf, strlen(Buf), 0); memset(Buf, 0, BUF_LEN); // 重置缓冲区 /* 接受服务端的返回数据 */ recv(ClientFd, Buf, BUF_LEN, 0); printf("服务端发送过来的数据为:%s\n", Buf); memset(Buf, 0, BUF_LEN); // 重置缓冲区 close(ClientFd); // 关闭套接字 } return 0; }
gcc linux_tcp_server.c -o linux_tcp_server
gcc linux_tcp_client.c -o linux_tcp_client
$ ./linux_tcp_server
客户端发送过来的数据为:hello
客户端发送过来的数据为:world
$ ./linux_tcp_client
请输入一个字符串,发送给服务端:hello
服务端发送过来的数据为:hello
请输入一个字符串,发送给服务端:world
服务端发送过来的数据为:hello
请输入一个字符串,发送给服务端:
$ ./linux_tcp_client
bind error!
#include <stdio.h> #include <winsock2.h> #define BUF_LEN 100 int main(void) { WSADATA wd; SOCKET ServerSock; char Buf[BUF_LEN] = {0}; SOCKADDR ClientAddr; SOCKADDR_IN ServerSockAddr; int addr_size = 0; /* 初始化操作sock需要的DLL */ WSAStartup(MAKEWORD(2,2),&wd); /* 创建服务端socket */ if(-1 == (ServerSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))) { printf("socket error!\n"); exit(1); } /* 设置服务端信息 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); // 给结构体ServerSockAddr清零 ServerSockAddr.sin_family = AF_INET; // 使用IPv4地址 ServerSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 自动获取IP地址 ServerSockAddr.sin_port = htons(1314); // 端口 /* 绑定套接字 */ if (-1 == (bind(ServerSock, (SOCKADDR*)&ServerSockAddr, sizeof(SOCKADDR)))) { printf("bind error!\n"); exit(1); } addr_size = sizeof(SOCKADDR); while (1) { /* 接受客户端的返回数据 */ int str_len = recvfrom(ServerSock, Buf, BUF_LEN, 0, &ClientAddr, &addr_size); printf("客户端发送过来的数据为:%s\n", Buf); /* 发送数据到客户端 */ sendto(ServerSock, Buf, str_len, 0, &ClientAddr, addr_size); /* 清空缓冲区 */ memset(Buf, 0, BUF_LEN); } /*如果有退出循环的条件,这里还需要清除对socket库的使用*/ /* 关闭服务端套接字 */ //closesocket(ServerSock); /* WSACleanup();*/ return 0; }
#include <stdio.h> #include <winsock2.h> #define BUF_LEN 100 int main(void) { WSADATA wd; SOCKET ClientSock; char Buf[BUF_LEN] = {0}; SOCKADDR ServerAddr; SOCKADDR_IN ServerSockAddr; int ServerAddrLen = 0; /* 初始化操作sock需要的DLL */ WSAStartup(MAKEWORD(2,2),&wd); /* 创建客户端socket */ if (-1 == (ClientSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))) { printf("socket error!\n"); exit(1); } /* 向服务器发起请求 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); ServerSockAddr.sin_family = PF_INET; ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ServerSockAddr.sin_port = htons(1314); ServerAddrLen = sizeof(ServerAddr); while (1) { printf("请输入一个字符串,发送给服务端:"); gets(Buf); /* 发送数据到服务端 */ sendto(ClientSock, Buf, strlen(Buf), 0, (struct sockaddr*)&ServerSockAddr, sizeof(ServerSockAddr)); /* 接受服务端的返回数据 */ recvfrom(ClientSock, Buf, BUF_LEN, 0, &ServerAddr, &ServerAddrLen); printf("服务端发送过来的数据为:%s\n", Buf); memset(Buf, 0, BUF_LEN); // 重置缓冲区 } closesocket(ClientSock); // 关闭套接字 // WSACleanup(); /*如果有退出循环的条件,这里还需要清除对socket库的使用*/ return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #define BUF_LEN 100 int main(void) { int ServerFd; char Buf[BUF_LEN] = {0}; struct sockaddr ClientAddr; struct sockaddr_in ServerSockAddr; int addr_size = 0; int optval = 1; /* 创建服务端socket */ if ( -1 == (ServerFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))) { printf("socket error!\n"); exit(1); } /* 设置服务端信息 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); // 给结构体ServerSockAddr清零 ServerSockAddr.sin_family = AF_INET; // 使用IPv4地址 ServerSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 自动获取IP地址 ServerSockAddr.sin_port = htons(1314); // 端口 // 设置地址和端口号可以重复使用 if (setsockopt(ServerFd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { printf("setsockopt error!\n"); exit(1); } /* 绑定操作,绑定前加上上面的socket属性可重复使用地址 */ if (-1 == bind(ServerFd, (struct sockaddr*)&ServerSockAddr, sizeof(ServerSockAddr))) { printf("bind error!\n"); exit(1); } addr_size = sizeof(ClientAddr); while (1) { /* 接受客户端的返回数据 */ int str_len = recvfrom(ServerFd, Buf, BUF_LEN, 0, &ClientAddr, &addr_size); printf("客户端发送过来的数据为:%s\n", Buf); /* 发送数据到客户端 */ sendto(ServerFd, Buf, str_len, 0, &ClientAddr, addr_size); /* 清空缓冲区 */ memset(Buf, 0, BUF_LEN); } close(ServerFd); return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define BUF_LEN 100 int main(void) { int ClientFd; char Buf[BUF_LEN] = {0}; struct sockaddr ServerAddr; int addr_size = 0; struct sockaddr_in ServerSockAddr; /* 创建客户端socket */ if (-1 == (ClientFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))) { printf("socket error!\n"); exit(1); } /* 向服务器发起请求 */ memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); ServerSockAddr.sin_family = PF_INET; ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ServerSockAddr.sin_port = htons(1314); addr_size = sizeof(ServerAddr); while (1) { printf("请输入一个字符串,发送给服务端:"); gets(Buf); /* 发送数据到服务端 */ sendto(ClientFd, Buf, strlen(Buf), 0, (struct sockaddr*)&ServerSockAddr, sizeof(ServerSockAddr)); /* 接受服务端的返回数据 */ recvfrom(ClientFd, Buf, BUF_LEN, 0, &ServerAddr, &addr_size); printf("服务端发送过来的数据为:%s\n", Buf); memset(Buf, 0, BUF_LEN); // 重置缓冲区 } close(ClientFd); // 关闭套接字 return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。