公网服务器端:
单线程,循环接收连接请求。之后转发两个客户端的IP和端口,转发发完成后自行关闭。
/*
文件:server.c
PS:第一个连接上服务器的客户端,称为client1,第二个连接上服务器的客户端称为client2
这个服务器的功能是:
1:对于client1,它返回"first",并在client2连接上之后,将client2经过转换后的IP和port发给client1;
2:对于client2,它返回client1经过转换后的IP和port和自身的port,并在随后断开与他们的连接。
*/
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
#define MAXLINE 128
#define SERV_PORT 8877
//发生了致命错误,退出程序
void error_quit(const char *str) {
fprintf(stderr, "%s", str);
//如果设置了错误号,就输入出错原因
if (errno != 0)
fprintf(stderr, " : %s", strerror(errno));
printf("\n");
exit(1);
}
int main(void) {
int res, cur_port;
int connfd, firstfd, listenfd;
int count = 0;
char str_ip[MAXLINE] = {0}; //当前IP地址
char str_ip1[MAXLINE] = {0}; //缓存IP地址1
char cur_inf[MAXLINE] = {0}; //当前的连接信息[IP+port]
char first_inf[MAXLINE] = {0}; //第一个链接的信息[IP+port]
char buffer[MAXLINE] = {0}; //临时发送缓冲区
struct sockaddr_in cliaddr;
struct sockaddr_in servaddr;
socklen_t clilen;
int aport = 0;
memset(&cliaddr, 0, sizeof (sockaddr_in));
clilen = (socklen_t)sizeof (cliaddr);
//创建用于监听TCP协议套接字
listenfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
//把socket和socket地址结构联系起来
res = bind(listenfd, (struct sockaddr *) &servaddr, sizeof (servaddr));
if (-1 == res)
error_quit("bind error");
while (1) {
printf("waiting\n");
fflush(stdout);
//接收来自客户端的连接
sockaddr_