ファイアウォールポートのテストデバッグに使用できる推奨tcpサーバ
1983 ワード
直接コードをつけて、gccはコンパイルして、1つのパラメータを持って、つまりリスニングするポート番号が必要です.
コードはGoogle検索に由来し、いくつかの修正と調整を行いました.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 4096 /*max text line length*/
#define LISTENQ 8 /*maximum number of client connections*/
void main(int argc, char *argv[])
{
int sockfd, portno, connfd, n;
socklen_t clilen;
char buf[MAXLINE];
struct sockaddr_in cliaddr, servaddr;
if (argc < 2) {
fprintf(stderr, "[ERROR] no port number provided, usage: po portno
");
exit(1);
}
portno = atoi(argv[1]);
//creation of the socket
sockfd = socket (AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
fprintf(stderr, "[ERROR] failed on opening socket
");
exit(1);
}
//preparation of the socket address
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
fprintf(stderr, "[ERROR] failed on binding
");
exit(1);
}
listen(sockfd, LISTENQ);
printf("%s
","[INFO] server running, waiting for connections...");
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen);
if (connfd < 0) {
fprintf(stderr, "[ERROR] failed on accept
");
}
else {
printf("%s
","[INFO] received request...
");
while ((n = recv(connfd, buf, MAXLINE,0)) > 0) {
printf("%s","[INFO] string received from and resent to the client:
");
puts(buf);
send(connfd, buf, n, 0);
}
if (n < 0) {
fprintf(stderr, "[ERROR] failed on read
");
exit(1);
}
close(connfd);
}
}
//close listening socket
close(sockfd);
}
コードはGoogle検索に由来し、いくつかの修正と調整を行いました.