2017-10-24 6 views
-2

データを接続してポートを待機するアプリケーションを作成しようとすると、このエラーが発生します。非ソケットCでのソケット操作

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

int main(int argc, char * arg[]){ 
int conn_s = socket(AF_INET, SOCK_STREAM, 0);  //Create the socket 

struct sockaddr_in servaddr; 

memset(&servaddr, 0, sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_port = htons(1234); 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
int res = bind(conn_s, (struct sockaddr *) &servaddr, sizeof(servaddr)); 

if(res < 0){ 
    printf("Error has occured\n"); 
} 

FILE * stream = fdopen(conn_s, "w+");    //Create a stream for the socket 
FILE * file = fopen("response2.txt", "w+");   //Create a file to store the output of the stream 

char * line = NULL; //Where each line of the stream will be stored in 
size_t len = 0;  // The length of the line 
ssize_t bytes;   //The size of the line in bytes 

int lis = listen(conn_s, SOMAXCONN); 
fcntl(lis, F_SETFL, O_NONBLOCK); 

while(1) { 
    conn_s = accept(lis, NULL, NULL); 
    if(conn_s < 0){ 
     if((errno == EAGAIN) || (errno == EWOULDBLOCK)) 
      continue; 
     perror("Failed to accept connection"); 
     exit(EXIT_FAILURE); 
    } 

    long conn_s_flags = fcntl(conn_s, F_GETFL); 
    fcntl(conn_s, F_SETFL, conn_s_flags & ~O_NONBLOCK); 

    while((bytes = getline(&line, &len, stream)) != -1) { 
     printf("%s\n", line); 
     fwrite(line, sizeof(char), bytes, file);    
    } 

    close(conn_s); 
} 
free(line); 

return 0; 
} 

私は、ポート1234に接続し、それを聞いて、データを受け取るためにそれを受け入れることをしようとしていますが、エラーは破壊に対する保持します。

また、netcatを使ってテストしようとしていますが、指定したポートでncが動作しているときはいつも別のエラーが発生します。

おかげ

+0

しかし、エラーは発生し続ける_:あなたは私に特定のボアを必要とします。 –

+0

fcntlのためにExept、あなたは 'conn_s'で何もしません(閉じる前に) – joop

+0

あなたはどんなことを言っていますか? – Devolus

答えて

1
int lis = listen(conn_s, SOMAXCONN); 
fcntl(lis, F_SETFL, O_NONBLOCK); 
while(1) { 
    conn_s = accept(lis, NULL, NULL); 

listen()は、ソケットのFDを返しません。ゼロまたは-1を返します。したがって、次の行は、次のように、accept()呼び出しのように誤っています。それは次のようになります。

if (listen(conn_s, SOMAXCONN) == -1) 
{ 
    perror("listen"); 
    return; // or whatever 
} 
fcntl(conn_s, F_SETFL, O_NONBLOCK); 
while(1) { 
    int conn_c = accept(conn_s, NULL, NULL); 

NBはそれにaccept()の結果を格納することによってconn_sを失うことはありません。

関連する問題