目录
Client端代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char **argv){
int n = 0;
char send_buffer[] = "Hello World";
int send_size = sizeof(send_buffer);
struct sockaddr_in server_addr;
memset((void *)&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8001);
server_addr.sin_addr.s_addr = inet_addr("192.168.85.132");
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sock_fd)
{
printf("Create socket err\n");
return -1;
}
while(1)
{
if (connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
{
printf("connect socket err\n");
close(sock_fd);
sleep(1);
continue;
}
while(1)
{
n = send(sock_fd, send_buffer, send_size, 0);
printf("send buffer size %d\n", n);
sleep(3);
}
}
out:
if (-1 != sock_fd)
{
close(sock_fd);
return -1;
}
return true;
}
Server端代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char **argv)
{
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int accept_fd = -1;
socklen_t client_len = 0;
int recv_len = 0;
char recv_buffer[256];
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sock_fd)
{
printf("Create socket err\n");
return -1;
}
memset((void *)&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8001);
server_addr.sin_addr.s_addr = inet_addr("192.168.85.132");
if (bind(sock_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
printf("Bind socket err\n");
goto out;
}
while(1)
{
if (listen(sock_fd, 50) == -1)
{
printf("listen socket err\n");
goto out;
}
accept_fd = accept(sock_fd, (struct sockaddr *) &client_addr, &client_len);
if (accept_fd < 0)
{
printf("Accept socket err\n");
goto out;
}
while(1)
{
recv_len = recv(accept_fd, recv_buffer, 256, 0);
if (recv_len <= 0)
{
printf("recv socket err\n");
goto out;
}
else
{
printf("recv len %d\n", recv_len);
}
}
close(accept_fd);
}
out:
if (-1 != sock_fd)
{
close(sock_fd);
return -1;
}
return true;
}
Server端多线程版本代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_THREAD_NUM 512
typedef struct thread_config_t
{
pthread_t thread[MAX_THREAD_NUM];
int index;
}thread_config_t;
typedef struct thread_args_t
{
int accept_fd;
int index;
}thread_args_t;
thread_config_t g_thread_config;
void *receive(void *args)
{
char recv_buffer[256];
int recv_len = 0;
thread_args_t thread_args;
memcpy((void *)&thread_args, (void *)args, sizeof(thread_args));
while(1)
{
recv_len = recv(thread_args.accept_fd, recv_buffer, 256, 0);
if (recv_len <= 0)
{
printf("recv socket err\n");
break;
}
else
{
printf("recv fd %d len %d index %d\n", thread_args.accept_fd, recv_len, thread_args.index);
}
}
close(thread_args.accept_fd);
printf("exit thread index %d\n", recv_len, thread_args.index);
}
int pthread_rcv(int accept_fd) {
if (g_thread_config.index >= MAX_THREAD_NUM)
{
return -1;
}
thread_args_t thread_args;
thread_args.accept_fd = accept_fd;
thread_args.index = g_thread_config.index++;
pthread_create(&g_thread_config.thread[thread_args.index], NULL, receive, (void*)&thread_args);
pthread_detach(g_thread_config.thread[thread_args.index]);
return 0;
}
int main(int argc, char **argv)
{
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int accept_fd = -1;
socklen_t client_len = 0;
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sock_fd)
{
printf("Create socket err\n");
return -1;
}
memset((void *)&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8001);
server_addr.sin_addr.s_addr = inet_addr("192.168.85.132");
if (bind(sock_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
printf("Bind socket err\n");
goto out;
}
while(1)
{
if (listen(sock_fd, 50) == -1)
{
printf("listen socket err\n");
goto out;
}
accept_fd = accept(sock_fd, (struct sockaddr *) &client_addr, &client_len);
if (accept_fd < 0)
{
printf("Accept socket err\n");
goto out;
}
printf("Accept socket %d\n", accept_fd);
pthread_rcv(accept_fd);
}
out:
if (-1 != sock_fd)
{
close(sock_fd);
return -1;
}
return true;
}