C中两个服务器的套接字客户端
Socket client for two servers in C
在我的 C 程序中,我需要与两台服务器通信,一台 IP=X1 PORT=X2,另一台 IP=Y1,PORT=Y2。 IE。我希望能够在我的程序中写入和读取 to/from 两个服务器。
例如
write(Server1,buffer1);
read(Server1,buffer1);
write(Server2,buffer2);
read(Server2,buffer2);
我知道如何创建用于与一台服务器通信的单个套接字客户端,但我不确定与两台服务器通信的代码应该是什么样子。有没有人正确指导我 direction/show 我举个例子?
问候西蒙
我很抱歉英语不好,给了一个Windows代码,我暂时不能写Linux,但我希望下次能写。
虽然windows的版本一开始可能有点吓人,但仔细看代码就会明白了。此外,您必须从 Windows 到 POSIX 到 Linux 版本进行一些更改,这是非常直接的(例如,使用 POSIX 线程而不是 windows 线程)。
我已经创建了套接字来接收连接并按照您预期的模式 recv-send 更改消息。每个服务器可能接收的连接数受 MAX_THREADS 限制(每个线程管理一个连接)。请注意,select() returns 具有挂起连接以调用 accept() 的服务器套接字。
#include <winSock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <WS2tcpip.h>
#include <stdint.h>
#include <processthreadsapi.h>
#include <heapapi.h>
#define MAX_THREADS 20
#define MAX_BUFF_SIZE 256
struct thread_list
{
HANDLE thread;
struct thread_list *next;
};
struct MyData {
char name_server[8];
int sock;
};
void log_error(char *msg)
{
printf(msg);
exit(EXIT_FAILURE);
}
void initSocket(int *server, struct sockaddr_in *addr, char *ip, uint16_t porta){
if ((*server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
log_error("Erro socket\n");
}
addr->sin_port = htons(porta);
addr->sin_addr.s_addr = inet_addr(ip);
addr->sin_family = AF_INET;
if((bind(*server, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0))
log_error("ERROR bind()");
if(listen(*server, SOMAXCONN) == SOCKET_ERROR)
log_error("error listen()");
return;
}
DWORD WINAPI ThreadFunc(void *data)
{
char messageFrom[MAX_BUFF_SIZE], messageTo[MAX_BUFF_SIZE];
struct MyData *ptr = (struct MyData *)data;
// pattern: recv - send
while(1)
{
recv(ptr->sock, messageFrom, MAX_BUFF_SIZE, 0);
printf(messageFrom);
strcpy(messageTo, "Message received. Complete send() message in your way");
send(ptr->sock, messageTo, strlen(messageTo), 0);
}
// Save the whales, feed the hungry, free the mallocs()'s
}
int main( int argc, char **argv) {
struct sockaddr_in addr1, addr2;
int server1, server2;
struct MyData *pDataArray[MAX_THREADS];
DWORD dwThreadIdArray[MAX_THREADS];
HANDLE hThreadArray[MAX_THREADS];
// init num current active threads
int num_threads = 0;
if(argc < 5)
log_error("Format: ./prog ip1 port1 ip2 port2\n");
initSocket(&server1, &addr1, argv[1], (uint16_t)atoi(argv[2]));
initSocket(&server2, &addr2, argv[3], (uint16_t)atoi(argv[4]));
int evtsock, novosock;
fd_set readfds;
FD_SET(server1, &readfds);
FD_SET(server2, &readfds);
struct sockaddr their_addr;
socklen_t strg_sz = sizeof(their_addr);
while(1) { //escuta conexoes
evtsock = select(0, &readfds, NULL, NULL, NULL);
pDataArray[num_threads]->sock = accept(evtsock, &their_addr, &strg_sz);
if(pDataArray[num_threads]->sock == INVALID_SOCKET)
log_error("ERROR accept()");
if(num_threads == MAX_THREADS){
// now this program will run forever. It is recommended to manage signals like SIGTERM
// free mallocated memory and release all resources carefully
printf("Max connections reached\n");
continue;
}
pDataArray[num_threads] = (struct MyData *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(struct MyData));
if(evtsock == server1)
strcpy(pDataArray[num_threads]->name_server, "server1");
else if(evtsock == server1)
strcpy(pDataArray[num_threads]->name_server, "server2");
else
printf("Unmanaged event\n");
hThreadArray[num_threads] = CreateThread(NULL, 0, ThreadFunc, &pDataArray[num_threads], 0, NULL);
num_threads++;
}
return 0;
}
在我的 C 程序中,我需要与两台服务器通信,一台 IP=X1 PORT=X2,另一台 IP=Y1,PORT=Y2。 IE。我希望能够在我的程序中写入和读取 to/from 两个服务器。 例如
write(Server1,buffer1);
read(Server1,buffer1);
write(Server2,buffer2);
read(Server2,buffer2);
我知道如何创建用于与一台服务器通信的单个套接字客户端,但我不确定与两台服务器通信的代码应该是什么样子。有没有人正确指导我 direction/show 我举个例子?
问候西蒙
我很抱歉英语不好,给了一个Windows代码,我暂时不能写Linux,但我希望下次能写。
虽然windows的版本一开始可能有点吓人,但仔细看代码就会明白了。此外,您必须从 Windows 到 POSIX 到 Linux 版本进行一些更改,这是非常直接的(例如,使用 POSIX 线程而不是 windows 线程)。
我已经创建了套接字来接收连接并按照您预期的模式 recv-send 更改消息。每个服务器可能接收的连接数受 MAX_THREADS 限制(每个线程管理一个连接)。请注意,select() returns 具有挂起连接以调用 accept() 的服务器套接字。
#include <winSock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <WS2tcpip.h>
#include <stdint.h>
#include <processthreadsapi.h>
#include <heapapi.h>
#define MAX_THREADS 20
#define MAX_BUFF_SIZE 256
struct thread_list
{
HANDLE thread;
struct thread_list *next;
};
struct MyData {
char name_server[8];
int sock;
};
void log_error(char *msg)
{
printf(msg);
exit(EXIT_FAILURE);
}
void initSocket(int *server, struct sockaddr_in *addr, char *ip, uint16_t porta){
if ((*server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
log_error("Erro socket\n");
}
addr->sin_port = htons(porta);
addr->sin_addr.s_addr = inet_addr(ip);
addr->sin_family = AF_INET;
if((bind(*server, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0))
log_error("ERROR bind()");
if(listen(*server, SOMAXCONN) == SOCKET_ERROR)
log_error("error listen()");
return;
}
DWORD WINAPI ThreadFunc(void *data)
{
char messageFrom[MAX_BUFF_SIZE], messageTo[MAX_BUFF_SIZE];
struct MyData *ptr = (struct MyData *)data;
// pattern: recv - send
while(1)
{
recv(ptr->sock, messageFrom, MAX_BUFF_SIZE, 0);
printf(messageFrom);
strcpy(messageTo, "Message received. Complete send() message in your way");
send(ptr->sock, messageTo, strlen(messageTo), 0);
}
// Save the whales, feed the hungry, free the mallocs()'s
}
int main( int argc, char **argv) {
struct sockaddr_in addr1, addr2;
int server1, server2;
struct MyData *pDataArray[MAX_THREADS];
DWORD dwThreadIdArray[MAX_THREADS];
HANDLE hThreadArray[MAX_THREADS];
// init num current active threads
int num_threads = 0;
if(argc < 5)
log_error("Format: ./prog ip1 port1 ip2 port2\n");
initSocket(&server1, &addr1, argv[1], (uint16_t)atoi(argv[2]));
initSocket(&server2, &addr2, argv[3], (uint16_t)atoi(argv[4]));
int evtsock, novosock;
fd_set readfds;
FD_SET(server1, &readfds);
FD_SET(server2, &readfds);
struct sockaddr their_addr;
socklen_t strg_sz = sizeof(their_addr);
while(1) { //escuta conexoes
evtsock = select(0, &readfds, NULL, NULL, NULL);
pDataArray[num_threads]->sock = accept(evtsock, &their_addr, &strg_sz);
if(pDataArray[num_threads]->sock == INVALID_SOCKET)
log_error("ERROR accept()");
if(num_threads == MAX_THREADS){
// now this program will run forever. It is recommended to manage signals like SIGTERM
// free mallocated memory and release all resources carefully
printf("Max connections reached\n");
continue;
}
pDataArray[num_threads] = (struct MyData *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(struct MyData));
if(evtsock == server1)
strcpy(pDataArray[num_threads]->name_server, "server1");
else if(evtsock == server1)
strcpy(pDataArray[num_threads]->name_server, "server2");
else
printf("Unmanaged event\n");
hThreadArray[num_threads] = CreateThread(NULL, 0, ThreadFunc, &pDataArray[num_threads], 0, NULL);
num_threads++;
}
return 0;
}