1) 1 server – 1 client
仅有一条字符串消息(server收,client发)
server
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_LEN 32
int main(int argc, char *argv[])
{
int server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(9000);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
if (listen(server_fd, 1) != 0) {
printf("listen failed, errno : %s\n", strerror(errno));
return -1;
}
int sockaddr_in_size = sizeof(struct sockaddr_in);
struct sockaddr_in client_addr;
int client_fd = accept(server_fd, (struct sockaddr *)(&client_addr), (socklen_t *)(&sockaddr_in_size));
if (client_fd < 0) {
printf("accept failed, errno : %s\n", strerror(errno));
return -1;
}
printf("accept succeed, [ip]:[port] is [%s]:[%d]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
char buf[BUF_LEN];
memset(buf, 0, BUF_LEN);
int recv_len = recv(client_fd, buf, BUF_LEN, 0);
if (recv_len == 0) {
printf("client closed abnormally, errno : %s\n", strerror(errno));
return -1;
} else if (recv_len < 0) {
printf("recv data failed, errno : %s\n", strerror(errno));
return -1;
}
printf("received data is : [%s]\n", buf);
close(server_fd);
return 0;
}
client
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_LEN 32
int main(int argc, char *argv[])
{
int client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(struct sockaddr_in));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = inet_addr("192.168.1.11");
client_addr.sin_port = htons(9500);
if (bind(client_fd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("192.168.1.10");
server_addr.sin_port = htons(9000);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("connect failed, errno : %s\n", strerror(errno));
return -1;
}
char buf[BUF_LEN];
memset(buf, 0, BUF_LEN);
snprintf(buf, BUF_LEN, "client fd is %d", client_fd);
if (send(client_fd, buf, BUF_LEN, 0) <= 0) {
printf("send data failed, errno : %s\n", strerror(errno));
return -1;
}
sleep(1);
close(client_fd);
return 0;
}
循环发送多条数据(server收,client发)
server
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_LEN 32
struct Data {
char ip_addr[BUF_LEN];
int port;
};
int main(int argc, char *argv[])
{
int server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(9000);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
if (listen(server_fd, 1) != 0) {
printf("listen failed, errno : %s\n", strerror(errno));
return -1;
}
int sockaddr_in_size = sizeof(struct sockaddr_in);
struct sockaddr_in client_addr;
int client_fd = accept(server_fd, (struct sockaddr *)(&client_addr), (socklen_t *)(&sockaddr_in_size));
if (client_fd < 0) {
printf("accept failed, errno : %s\n", strerror(errno));
return -1;
}
printf("accept succeed, [ip]:[port] is [%s]:[%d]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
while (1) {
struct Data recv_data;
memset(&recv_data, 0, sizeof(struct Data));
int recv_len = recv(client_fd, &recv_data, sizeof(struct Data), 0);
if (recv_len == 0) {
printf("client closed abnormally, errno : %s\n", strerror(errno));
return -1;
} else if (recv_len < 0) {
printf("recv data failed, errno : %s\n", strerror(errno));
return -1;
}
printf("received data is : [%s][%d]\n", recv_data.ip_addr, recv_data.port);
}
close(server_fd);
return 0;
}
client
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_LEN 32
struct Data {
char ip_addr[BUF_LEN];
int port;
};
int main(int argc, char *argv[])
{
int client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(struct sockaddr_in));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = inet_addr("192.168.1.11");
client_addr.sin_port = htons(9500);
if (bind(client_fd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("192.168.1.10");
server_addr.sin_port = htons(9000);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("connect failed, errno : %s\n", strerror(errno));
return -1;
}
while (1) {
struct Data recv_data = { "192.168.1.11", 9500 };
if (send(client_fd, &recv_data, sizeof(struct Data), 0) <= 0) {
printf("send data failed, errno : %s\n", strerror(errno));
return -1;
}
sleep(1);
}
sleep(1);
close(client_fd);
return 0;
}
server和client均可收发
server
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#define BUF_LEN 32
struct Data {
char ip_addr[BUF_LEN];
int port;
};
int client_fd = 0;
void *recvThread(void *client_fd)
{
int _client_fd = *((int *)client_fd);
while (1) {
struct Data recv_data;
memset(&recv_data, 0, sizeof(struct Data));
int recv_len = recv(_client_fd, &recv_data, sizeof(struct Data), 0);
if (recv_len == 0) {
printf("client closed abnormally, errno : %s\n", strerror(errno));
pthread_exit(NULL);
} else if (recv_len < 0) {
printf("recv data failed, errno : %s\n", strerror(errno));
pthread_exit(NULL);
}
printf("received data is : [%s][%d]\n", recv_data.ip_addr, recv_data.port);
}
pthread_exit(NULL);
}
void *acceptThread(void *server_fd)
{
pthread_t thrRecv[CLIENT_NUM];
int client_count = 0;
while (1) {
int _server_fd = *((int *)server_fd);
int sockaddr_in_size = sizeof(struct sockaddr_in);
struct sockaddr_in client_addr;
client_fd = accept(_server_fd, (struct sockaddr *)(&client_addr), (socklen_t *)(&sockaddr_in_size));
if (client_fd < 0) {
printf("accept failed, errno : %s\n", strerror(errno));
pthread_exit(NULL);
}
printf("accept succeed, [ip]:[port] is [%s]:[%d]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
thrRecv[client_count] = 0;
pthread_create(&thrRecv[client_count], NULL, recvThread, &client_fd);
pthread_join(thrRecv[client_count], NULL);
client_count++;
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
int server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(9000);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
if (listen(server_fd, 1) != 0) {
printf("listen failed, errno : %s\n", strerror(errno));
return -1;
}
pthread_t thrAccept = 0;
pthread_create(&thrAccept, NULL, acceptThread, &server_fd);
while (1) {
char send_buf[BUF_LEN] = "Msg from server.";
while (client_fd == 0) { sleep(1); }
if (send(client_fd, send_buf, BUF_LEN, 0) <= 0) {
printf("send failed, errno : %s\n", strerror(errno));
return -1;
}
sleep(1);
}
pthread_join(thrAccept, NULL);
close(server_fd);
return 0;
}
client
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#define BUF_LEN 32
struct Data {
char ip_addr[BUF_LEN];
int port;
};
void *recvThread(void *client_fd)
{
int _client_fd = *((int *)client_fd);
while (1) {
char recv_buf[BUF_LEN];
memset(recv_buf, 0, BUF_LEN);
int recv_len = recv(_client_fd, recv_buf, BUF_LEN, 0);
if (recv_len == 0) {
printf("server closed abnormally, errno : %s\n", strerror(errno));
pthread_exit(NULL);
} else if (recv_len < 0) {
printf("recv data failed, errno : %s\n", strerror(errno));
pthread_exit(NULL);
}
printf("received data is : [%s]\n", recv_buf);
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
char client_ip[BUF_LEN];
char server_ip[BUF_LEN];
memcpy(client_ip, argv[1], strlen(argv[1]));
memcpy(server_ip, argv[2], strlen(argv[2]));
int client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(struct sockaddr_in));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = inet_addr(client_ip);
client_addr.sin_port = htons(9500);
if (bind(client_fd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_ip);
server_addr.sin_port = htons(9000);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("connect failed, errno : %s\n", strerror(errno));
return -1;
}
pthread_t thrRecv = 0;
pthread_create(&thrRecv, NULL, recvThread, &client_fd);
while (1) {
struct Data recv_data = { "192.168.1.11", 9500 };
if (send(client_fd, &recv_data, sizeof(struct Data), 0) <= 0) {
printf("send data failed, errno : %s\n", strerror(errno));
return -1;
}
sleep(1);
}
sleep(1);
close(client_fd);
return 0;
}
2) 1 server – n client
server
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#define BUF_LEN 32
#define CLIENT_NUM 5
struct Data {
char ip_addr[BUF_LEN];
int port;
};
void *recvThread(void *client_fd)
{
int _client_fd = *((int *)client_fd);
while (1) {
struct Data recv_data;
memset(&recv_data, 0, sizeof(struct Data));
int recv_len = recv(_client_fd, &recv_data, sizeof(struct Data), 0);
if (recv_len == 0) {
printf("client closed abnormally, errno : %s\n", strerror(errno));
pthread_exit(NULL);
} else if (recv_len < 0) {
printf("recv data failed, errno : %s\n", strerror(errno));
pthread_exit(NULL);
}
printf("received data is : [%s][%d]\n", recv_data.ip_addr, recv_data.port);
}
pthread_exit(NULL);
}
void *acceptThread(void *server_fd)
{
pthread_t thrRecv[CLIENT_NUM];
int client_count = 0;
while (1) {
int _server_fd = *((int *)server_fd);
int sockaddr_in_size = sizeof(struct sockaddr_in);
struct sockaddr_in client_addr;
int client_fd = accept(_server_fd, (struct sockaddr *)(&client_addr), (socklen_t *)(&sockaddr_in_size));
if (client_fd < 0) {
printf("accept failed, errno : %s\n", strerror(errno));
pthread_exit(NULL);
}
printf("accept succeed, [ip]:[port] is [%s]:[%d]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
thrRecv[client_count] = 0;
pthread_create(&thrRecv[client_count], NULL, recvThread, &client_fd);
pthread_join(thrRecv[client_count], NULL);
client_count++;
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
int server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(9000);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
if (listen(server_fd, CLIENT_NUM) != 0) {
printf("listen failed, errno : %s\n", strerror(errno));
return -1;
}
pthread_t thrAccept = 0;
pthread_create(&thrAccept, NULL, acceptThread, &server_fd);
pthread_join(thrAccept, NULL);
close(server_fd);
return 0;
}
client
#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_LEN 32
struct Data {
char ip_addr[BUF_LEN];
int port;
};
int main(int argc, char *argv[])
{
char client_ip[BUF_LEN];
char server_ip[BUF_LEN];
memcpy(client_ip, argv[1], strlen(argv[1]));
memcpy(server_ip, argv[2], strlen(argv[2]));
int client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd < 0) {
printf("create socket failed, errno : %s\n", strerror(errno));
return -1;
}
int opt = 1;
setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(struct sockaddr_in));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = inet_addr(client_ip);
client_addr.sin_port = htons(9500);
if (bind(client_fd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) != 0) {
printf("bind failed, errno : %s\n", strerror(errno));
return -1;
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_ip);
server_addr.sin_port = htons(9000);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0) {
printf("connect failed, errno : %s\n", strerror(errno));
return -1;
}
while (1) {
struct Data recv_data;
recv_data.port = 9500;
memcpy(recv_data.ip_addr, client_ip, BUF_LEN);
if (send(client_fd, &recv_data, sizeof(struct Data), 0) <= 0) {
printf("send data failed, errno : %s\n", strerror(errno));
return -1;
}
sleep(1);
}
sleep(1);
close(client_fd);
return 0;
}