2016-09-17 69 views
0

我不知道問題出在客戶端還是服務器端,還是兩者兼而有之。這是我的第一個客戶端服務器套接字編程代碼。但是這不能按預期工作。我引用的代碼運行良好。

代碼運行時,客戶端和服務器都應該交換2條消息,但他們不這樣做。服務器顯示「Listening」,正如預期的那樣正確,但是當我運行客戶端代碼時,什麼也沒有發生,它什麼也沒有顯示。

這是客戶端代碼客戶端服務器通信未發生。發送函數後客戶端代碼不顯示

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

int main() { 
    struct sockaddr_in mysocket, servsocket; 
    int err; 
    char buf[256]; 



    //CREATING SOCKET 
    int socketstatus = socket(AF_INET, SOCK_STREAM, 0); 
    printf("%d\n", socketstatus); 
    if(socketstatus < 0){ 
     printf("socket failed\n"); 
     scanf("%d", &err); 
     return 0; 
    } 



    bzero((char *) &mysocket, sizeof(mysocket)); 
    mysocket.sin_family = AF_INET; 
    mysocket.sin_addr.s_addr = inet_addr("127.0.0.2"); 
    int port = 5674; 
    mysocket.sin_port = htons(port); 


    //CONNECT 

    int connectstatus = connect(socketstatus, (struct sockaddr *) &servsocket, sizeof(servsocket)); 
    if(connectstatus < 0){ 
     printf("Connect failed\n"); 
     scanf("%d", &err); 
     return 0; 
    } 

    //SEND 

    bzero(buf, 256); 
    strcpy(buf, "Message sent by client"); 
    int sendstatus = send(socketstatus, buf, 256, 0); 
    printf("2\n");    //This is not being displayed 
    if(sendstatus < 0){ 
     printf("Client send failed\n"); 
     return 0; 
    } 
    printf("Reached for receiving\n"); 
    //RECEIVE 
    bzero(buf, 256); 
    int recvstatus = recv(socketstatus, buf, 256, 0); 
    if(recvstatus < 0){ 
     printf("Client RECEIVE failed\n"); 
     scanf("%d", &err); 
     return 0; 
    } 

    printf("The message client got from server is, %s \n",buf); 

    scanf("%d", &err); 

    printf("Bye"); 

} 



這是服務器代碼:

#include <stdio.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 
int main() { 
    int err; 
    struct sockaddr_in servsocket, clientsocket; 
    char sendmessage[256]; 

    //CREATING SOCKET 
    int mysocket = socket(AF_INET, SOCK_STREAM, 0); 
    if(mysocket < 0){ 
     printf("socket creation failed\n"); 
     scanf("%d", &err); 
     return 0; 
    } 

    bzero((char*) &servsocket, sizeof(servsocket)); //initiazlizing servsocket with null 
    servsocket.sin_family = AF_INET; 
    servsocket.sin_addr.s_addr = inet_addr("127.0.0.2"); 
    int port = 5674; 
    servsocket.sin_port = htons(port); 

    //BINDING 
    int bindstatus = bind(mysocket, (struct sockaddr*) &servsocket, sizeof(servsocket)); 
    if(bindstatus < 0){ 
     printf("Socket bind failed\n"); 
     scanf("%d", &err); 
     return 1; 
    } 

    //LISTENING 
    int listenstatus = listen(mysocket, 5); 
    if(listenstatus < 0){ 
     scanf("%d", &err); 
     return 2; 
    } 
    else 
     printf("LISTENING....\n"); 
    //ACCEPTING 
    int clientsize = sizeof(clientsocket); 
    int acceptstatus = accept(mysocket, (struct sockaddr*) &clientsocket, &clientsize); 
    if(acceptstatus < 0){ 
     printf("Accept failed"); 
     scanf("%d", &err); 
     return 3; 
    } 

    char buf[256]; 
    bzero(buf, 256); 

    //RECEIVING 

    int recvstatus = recv(acceptstatus, buf, 256, 0); 
    if(buf < 0){ 
     printf("Error:Nothing read"); 
     scanf("%d", &err); 
     return 4; 
    } 

    printf("I received this message, %s \n", buf); 
    printf("NOW I WILL SEND\n"); 

    //SENDING 
    bzero(sendmessage, 256); 
    strcpy(sendmessage, "Message sent by server"); 
    int sendstatus = send(acceptstatus, sendmessage, sizeof(sendmessage), 0); 
    if(sendstatus < 0){ 
     printf("Error sending\n"); 
     scanf("%d", &err); 
     return 5; 
    } 
    return 0; 
} 

回答

2

在客戶端的代碼,你初始化mysocket但通過serversocketconnect初始化。

您應該設置serversocket而不是mysocket的字段。

+0

雅我知道了,這是一個愚蠢的錯誤。謝謝 –

1

要連接到服務器套接字客戶端中(這將是serversocket在你的代碼,而不是mysocket):

bzero((char *) &servsocket, sizeof(servsocket)); 
servsocket.sin_family = AF_INET; 
servsocket.sin_addr.s_addr = inet_addr("127.0.0.2"); 
int port = 5674; 
servsocket.sin_port = htons(port); 

然後,我想你想你的INET地址爲127.0.0.1(是什麼通常是默認的localhost地址),而不是127.0.0.2

代碼是「工作」的,因爲您正在傳遞正確的套接字描述符(socketstatus),因爲它沒有正確連接到端點,所以在調用send()時失敗。

+0

雅我知道了,這是一個愚蠢的錯誤。謝謝 –