Tag: 服务器

bio_do_connect()返回-1

我正在尝试编写如下图所示的服务器/客户端应用程序。 issueTicket.cgi是一个用C编写的可执行文件。我的同事设置了apache并编写了issueTicket.cgi,我可以通过输入http:// [ubuntuIP] /cgi-bin/SEC_IssueTicket.cgi来访问issueTicket.cgi我的浏览器。 问题出在客户方面。 我必须使用Openssl在Windows上编写一个askTicket.exe,并且BIO_do_connect()始终返回-1。 以下是我的代码。 SSL_load_error_strings(); ERR_load_BIO_strings(); SSL_library_init(); /* Return value is always 1 */ OpenSSL_add_all_algorithms(); … *sslCtx = SSL_CTX_new(TLSv1_1_client_method()); sslRet = SSL_CTX_load_verify_locations(*sslCtx, (const char *)certpath, NULL); *sbio = BIO_new_ssl_connect(*sslCtx); BIO_set_conn_hostname(*sbio, “[ubuntuIP]:80/cgi-bin/issueTicket.cgi”); BIO_set_nbio(*sbio, 1); BIO_get_ssl(*sbio, &ssl); SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); BIO_do_connect(*sbio) // always return -1 任何人都可以告诉我的问题在哪里?

简单的网络服务器不起作用

我正在尝试在C中编写一个Web服务器。我知道我可以使用许多不同的库,但我希望它只能用winsock运行。 服务器和客户端可以来回发送数据,但加载网页是不可能的。 每次我收到“服务器无法访问”消息,但在服务器上我收到正在发送正文的消息。 我究竟做错了什么? 编辑我正在使用chrome和microsoft edge #include #include #include #pragma comment(lib,”ws2_32.lib”) void error(const char* err){ printf(“ERROR: %s\n”, err); exit(1); } char* readline(SOCKET s){ FILE * f = tmpfile(); char rec; int i=0; while(recv(s, &rec, 1, 0)>0){ i++; if(rec!=’\r’ && rec!=’\n’) fwrite(&rec, 1, 1, f); if(rec==’\r’ || rec==’\n’) break; } if(i==0){ fclose(f); return NULL; } fseek(f, […]

RECV缓冲区为空,但返回值> 1

我正在尝试创建一个简单的服务器,以便两个客户端可以相互通信。 主服务器代码接受两个客户端连接,然后分叉使用execl在两个客户端之间生成个人服务器的进程,以便主服务器可以继续查找新连接。 一切似乎工作正常,直到个人服务器试图联系客户,他们都收到胡言乱语,如果有人知道是什么原因导致这一点请告诉我。 接受两个客户端后的主服务器: if(fork() == 0){ close(listener); int nBytes; char* playerOne[20]; char* playerTwo[20]; //Creates strings to hold file descriptor information for execl char connAscii[sizeof(int)]; char connAscii2[sizeof(int)]; snprintf(connAscii,sizeof(conn), “%d”, conn); snprintf(connAscii2,sizeof(conn2), “%d”, conn2); fprintf(stderr, “Int conn: %d, asciiConn: %s, backToInt: %d\n”, conn, connAscii, atoi(connAscii)); char *argf[2]; argf[0] = connAscii; argf[1] = connAscii2; fprintf(stderr, “that is […]

Recv有时只提供错误的文件描述符(运行程序它工作正常,有时它不起作用)

场景:我有一个客户端(订阅者),其中包含编译和工作的代码,我有所说客户端的服务器,我可以在不同的bash窗口运行它,我有printf来显示我正在发送什么消息,服务器得到了什么,看看客户是否收到确认……一切。 在代码的某些地方可能存在问题但是它或多或少有效,因为我可以发送消息等(这都在本地机器上)。 我停止程序运行,再次执行,并且可能发生两件事:它正常工作,我可以再次发送任何消息,或者当我尝试从客户端发送到服务器时,服务器关闭并且客户也是如此,没有收到确认。 我想解释一下,如果没有我编译或做任何事情,就会发生这种情况。 启动程序,再次运行,有时会失败。 我到目前为止唯一的事情(因为我对每次使用的电话都感到恐惧)是: RECV错误:文件描述符错误 我得到了这段代码: if((longitudRecibida=recv(fdSocketDevuelto, &longitudTema, sizeof(int), 0)) < 0){ close(sock_tcp); perror("RECV error"); exit(1); } 我没有放更多代码的原因是因为我根本不知道如何重现失败。 有时它工作正常,没有任何一点它停止,有时我发送的第一个消息使两个进程都失败。 当发生这种情况时,当我打印客户端的IP地址,而不是我得到的通常的127.0.0.1时,我得到: Peer IP address: 2385:6095:e37f:: 为了得到那个打印我使用: char ipstr[INET6_ADDRSTRLEN]; if (addr.ss_family == AF_INET) { struct sockaddr_in *s = (struct sockaddr_in *)&addr; port = ntohs(s->sin_port); inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr); } else { // AF_INET6 struct […]

为什么我在C服务器程序中遇到分段错误(但有时只是)?

现在,我正在尝试编写一个简单的客户端/服务器应用程序,以便测量LAN上的各种大小的TCP消息的往返时间(我正在做时间客户端)。 该程序适用于小数据包大小(> 1000字节),但我最终得到一个分段错误:输入更大(10KB或更大)的11错误。 int main() { struct sockaddr_in sin; char buf[MAX_LINE]; int len; int s, new_s; /* build address data structure */ bzero((char *)& sin, sizeof( sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons( SERVER_PORT); /* setup passive open */ if (( s = socket( PF_INET, SOCK_STREAM, 0)) < 0) { perror("tcp program: […]

简单的TCP服务器无法输出到Web浏览器

我用C语言编写了一个简单的TCP客户端和服务器程序。 它在它们之间工作正常,但我有一个疑问。 如果我想从Web服务器访问TCP服务器怎么办? 我从Web服务器获得了标题,我无法write()回Web浏览器。 响应是否应该强制执行HTTP规范? 我收到以下错误 : 服务器代码: // Server side C program to demonstrate Socket programming #include #include #include #include #include #include #define PORT 8080 int main(int argc, char const *argv[]) { int server_fd, new_socket; long valread; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = “Hello from server”; […]