gpt4 book ai didi

c++ - 简单的网络编程程序 - 不工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:41 25 4
gpt4 key购买 nike

我刚开始学习网络编程。我的第一个程序非常简单:连接后,服务器程序显示客户端程序发送的内容(字符)。在连接之前一切正常。起初,我使用 putc 进行了发送循环:

while((c = getc(stdin)) != '\n')
putc(c, (FILE *) connection);

和带有getc的接收者:

while((c = getc((FILE *) connection)) != '\n')
putc(c, stdout);

连接后,出现段错误。然后我尝试使用发送:

while(1) {
memset(str, null, strlen(memset));

while(((c = getc(stdin)) != '\n') && sizeof(str) <= 100) {
strcat(str, (char *) c); // cast to char * is to make gcc happy
}

send(connection, (void *) str, sizeof(str), (int) NULL);
}

和接收:

while((stat = recv(connection,str,100,0)) != 0) {
printf("\nReceived %d bytes of data from %s: %s", stat, client, str);
}

现在 recv() 一直返回 -1 并且 errno 设置为 107。这是什么意思?我哪里做错了?顺便说一下,我正在使用带有 gcc 的 Linux。

非常感谢您的帮助! :)


编辑: 即使我使用了 getc() 和 putc(),我还是与 socket() 建立了连接,然后我连接了 ()(客户端)。服务器,在获得连接(使用 socket())后,bind(),然后是 listen() 和 accept()。对不起,如果我忘记了。


这是服务器代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netdb.h>

void main(int argc, char *argv[])
{
struct addrinfo hint;
struct addrinfo *servinfo, *count;
struct sockaddr_storage conn_addr;
struct sockaddr host;

int connessione;
int stat;
int conn_sock;
int conn_size;
int success;
int c;

char t[INET_ADDRSTRLEN];
char str[100];
char *client;

if(argc != 1 && strcmp(argv[1], "aiuto") == 0) {
printf("%s(porta)\n",argv[0]);
printf("porta: specifica su quale porta installarsi\n");
exit(-1);
}

memset(&hint,0,sizeof hint);


hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_STREAM;
hint.ai_flags = AI_PASSIVE;

if((stat = getaddrinfo(NULL, argv[1], &hint, &servinfo)) != 0) {
printf("\n[FATAL]: getaddrinfo: %s",gai_strerror(stat));
exit(-1);
}

success = 0;

for(count = servinfo; count != NULL; count = count->ai_next) {
if((connessione = socket(count->ai_family, count->ai_socktype, count->ai_protocol)) <= 0)
continue;

if((stat = bind(connessione, count->ai_addr, count->ai_addrlen)) == 0) {
success = 1;
break;
}
else {
continue;
}
}

if(success == 0) {
printf("\n[FATAL]: Unable to bind()!\n");
exit(-1);
}
else {
printf("\n[DEBUG]: %s: listening...", argv[0]);
}

servinfo = count;
freeaddrinfo(count);

if(listen(connessione, 20) == -1) {
printf("\n[FATAL]: listen: %s (%d)\n", gai_strerror(errno), errno);
close(connessione);
exit(-1);
}

conn_size = sizeof(conn_addr);

if(accept(connessione, (struct sockaddr *) &conn_addr, &conn_size) == -1) {
printf("\n[FATAL]: accept: %s", gai_strerror(errno));
close(connessione);
exit(-1);
}

client = (char *) malloc(INET_ADDRSTRLEN * sizeof(char));
client = inet_ntop(servinfo->ai_family, &conn_addr, t, INET_ADDRSTRLEN);

printf("\n[DEBUG]: %s: connection accepted: %s", argv[0], client);

while((stat = recv(connessione,str,100,0)) != 0) {
printf("\nReceived %d bytes of data from %s: %s", stat,client, str);
}

printf("\n[DEBUG]: connection closed by %s\n",client);
}

和客户端的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netdb.h>

void main(int argc, char *argv[])
{
struct addrinfo hint;
struct addrinfo *servinfo, *count;
struct sockaddr_storage conn_addr;
struct sockaddr host;

int connessione;
int stat;
int conn_sock;
int conn_size;
int success;
int c;

char t[INET_ADDRSTRLEN];
char *indirizzo;
char str[100];

memset(&hint,0,sizeof hint);

host.sa_family = AF_INET;
if(inet_pton(host.sa_family, argv[1], (void *) host.sa_data) == -1) {
printf("\n[FATAL]: pton: %s (%d)\n", gai_strerror(errno), errno);
exit(-1);
}

hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_STREAM;
hint.ai_flags = AI_PASSIVE;
hint.ai_addr = &host;

if((stat = getaddrinfo(argv[1], argv[2], &hint, &servinfo)) != 0) {
printf("[FATAL]: getaddrinfo: %s\n",gai_strerror(stat));
exit(-1);
}

success = 0;
for(count = servinfo; count != NULL; count = count->ai_next) {
if((connessione = socket(count->ai_family, count->ai_socktype, count->ai_protocol)) == -1)
continue;

if(connect(connessione, count->ai_addr, count->ai_addrlen) != -1) {
success = 1;
break;
}
}

if(success == 0) {
printf("\n[FATAL]: impossibile trovare l'host specificato\n");
exit(-1);
}

servinfo = count;
freeaddrinfo(count);

indirizzo = (char *) malloc(INET_ADDRSTRLEN * sizeof(char));
indirizzo = inet_ntop(servinfo->ai_family, &conn_addr, t, INET_ADDRSTRLEN);

printf("\n[DEBUG]: %s: connesso a: %s\n",argv[0], indirizzo);

while(1) {
strcpy(str,"buffer for data to send");

while(((c = getc(stdin)) != '\n') && sizeof(str) <= 100) {
strcat(str, (char *) c);
}

send(connessione, (void *) str, sizeof(str), (int) NULL);
}
}

最后...

效果很好!感谢大家。 :)

最佳答案

通常您不使用FILE * 句柄来进行网络编程。相反,您需要 socket(2) 系统调用返回的套接字描述符。获得它后,您可以connect(2) 它(客户端)或bind(2) 它(服务器)。可以使用 recv(2)send(2) 执行正在进行的通信。

如果您真的想使用FILE * 句柄进行网络编程,请查看fdopen(3) 库函数。它采用可由 socket(2) 返回的描述符并返回与 fread/fwrite 兼容的 FILE * 句柄/fprintf.

在发布您的完整代码后,我看到的最严重的错误是:

if (accept(connessione, (struct sockaddr *) &conn_addr, &conn_size))

accept(2) 返回一个套接字,您必须使用 recv(2)/send(2),然后丢弃而是使用服务器套接字。

关于c++ - 简单的网络编程程序 - 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4369731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com