2014-10-10 61 views
0

以下是試圖發送/接收少量緩衝區的單個服務器 - 客戶端代碼,稍後關閉連接。 服務器代碼:無法關閉服務器端套接字

#include <stdio.h> 
#include <stdlib.h>  
#include <string.h> 
#include <string> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <arpa/telnet.h> 
#include <unistd.h> 

char buff1[][3]= {{0xff , 0xfd, 0x18},{0xff , 0xfd, 0x1e},{0xff , 0xfd, 0x1d}}; 

char recbuf[1024]; 

void mwrite (int sock, char * buf, int size) 
{ 
    int n = send(sock, buf, size, 0); 
    if (n < 0) 
    { 
     perror("ERROR writing to socket"); 
     return; 
    } 

} 


void read (int sock) 
{ 
    char buffer[256]; 

    /* Now read client response */ 
    memset(buffer, 0, sizeof(buffer)); 
    int n = recv(sock, buffer, 255, 0); 
    if (n < 0) 
    { 
     perror("ERROR reading from socket"); 
     return; 
    } 
    for (int i = 0; i < n; i++) 
     printf("%2x ", buffer[i]);//printing ascii characters 
    printf("\n"); 
} 

int main(int argc , char *argv[]) 
{ 
    int sockfd , newsockfd , portno; 
    socklen_t clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 

    sockfd = socket(AF_INET , SOCK_STREAM , 0); 
    if (sockfd < 0) 
    { 
    perror("Error opening socket "); 
    exit(1); 
    } 

    /* Initialize socket structure */ 
    bzero((char *) &serv_addr , sizeof(serv_addr)); 
    portno = atoi(argv[1]); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY ; 
    serv_addr.sin_port = htons(portno); 

/* Now bind the host address using client */ 
    if(bind(sockfd, (struct sockaddr *) &serv_addr , sizeof(serv_addr)) <0) 

    { 
    perror("Error on binding"); 
    exit(1); 
    } 
     if(listen(sockfd,5)<0) 
    { 
     perror("Error on listen"); 
     exit(1); 
    } 
     int count = 1; 
     clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen); 

    if (newsockfd < 0) 
    { 
    perror("ERROR on accept"); 
    exit(1); 
    } 

     printf("Server Sending (DO TERMINAL TYPE)\n"); 
     while ((n = write(newsockfd,buff1,sizeof(buff1)))>0) 
     { 
      printf("Server Sent query %d: %x %x %x\n", count, buff1[count][0], buff1[count][1], buff1[count][2]); 
      n = read(newsockfd, recbuf , sizeof(recbuf)); 
      printf("Server received responset: %x %x %x\n", recbuf[0], recbuf[1], recbuf[2]); 
      count++; 
      count = count % 3; 
      if(n<0) 
      { 
      perror("Error writing to socket "); 
      exit(1); 
      } 

     } 
    return 0 ; 
} 

客戶端代碼:

#include <stdio.h> 
#include <stdlib.h>  
#include <string.h> 
#include <string> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <arpa/telnet.h> 
#include <unistd.h> 
#include <netdb.h> 

char buff2[] = {0xff,0xfc,0x18}; 

void read (int sock) 
{ 
    char buffer[256]; 

    /* Now read server response */ 
    memset(buffer, 0, sizeof(buffer)); 
    int n = recv(sock, buffer, 255, 0); 
    if (n < 0) 
    { 
     perror("ERROR reading from socket"); 
     return; 
    } 
    printf("\n%d bytes received buffer is: %s", n, buffer); 

} 

void mwrite (int sock, char * buf, int size) 
{ 
    int n = send(sock, buf, size, 0); 
    if (n < 0) 
    { 
     perror("ERROR writing to socket"); 
     return; 
    } 
    printf("Bytes Sent: %d\n", n); 
    } 


int main(int argc, char *argv[]) 
{ 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server1; 

    char buffer1[256]; 

    if (argc < 3) 
    { 
     fprintf(stderr,"usage %s hostname port\n", argv[0]); 
     return(0); 
    } 
    portno = atoi(argv[2]); 
    /* Create a socket point */ 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) 
    { 
     perror("ERROR opening socket"); 
     return(1); 
    } 

    server1 = gethostbyname(argv[1]); 
    if (server1 == NULL) 
    { 
    fprintf(stderr,"ERROR no such host \n"); 
    exit(0); 
    } 

    bzero((char *) &serv_addr , sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server1->h_addr, (char*)&serv_addr.sin_addr.s_addr, server1->h_length); 
    serv_addr.sin_port = htons(portno); 


/*Connect to server*/ 
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
    { 
     perror("ERROR connecting"); 
     return(1); 
    } 
    printf("Recieving Buffer 1 from Server side"); 
    bzero(buffer1,256); 
    while(true) 
    { 
    n= read(sockfd,buffer1,sizeof(buffer1)); 
    if(n<0) 
    printf("ERROR reading in socket %d len %d", n, sizeof(buffer1)); 

    n= write(sockfd,buff2,sizeof(buff2)); 
    if(n<0) 
    printf("ERROR writing in socket %d len %d", n, sizeof(buff2)); 
    printf("\nSent Buffer2 (WON'T TERMINAL TYPE) from client side"); 
    } 
return 0; 
} 

輸出: 服務器端:

./single_sample 5667 
Server Sending (DO TERMINAL TYPE) 
Server Sent query 1: ffffffff fffffffd 1e 
Server received responset: ffffffff fffffffc 18 
Server Sent query 2: ffffffff fffffffd 1d 
Server received responset: ffffffff fffffffc 18 
Error writing to socket : Connection reset by peer 

客戶端:

./sample_client 127.0.0.1 5667 
Recieving Buffer 1 from Server side 
Sent Buffer2 (WON'T TERMINAL TYPE) from client side 

基本上我我試圖在緩衝區發送完畢後關閉套接字。但是得到上述錯誤。我無法解決錯誤是從服務器端還是客戶端發生。 此外,雖然在Linux機器上運行此代碼如何捕獲wireshark上發送的數據字節 在此先感謝。

+0

很明顯,因爲服務器輸出說連接重置對等意味着客戶端已關閉套接字 – Rico 2014-10-10 18:44:04

+0

您可以添加一個無止境的循環像while(true)從套接字讀取和執行必要的行動 – Rico 2014-10-10 18:52:03

+0

@Rico在服務器或客戶端? ?? – Jonsnow29 2014-10-10 18:55:32

回答

0

客戶端寫入其消息,然後立即斷開連接,導致服務器出現Connection reset by peer錯誤 - 因爲連接的客戶端部分不再存在。

相關問題