2015-04-06 104 views
1

我想创建一个服务器和客户端,在Linux上这样C/C++ TCP套接字服务器读取

  1. 连接已经建立运行
  2. 客户端发送消息到服务器
  3. 服务器发送一个响应给客户
  4. 结束连接

使用http://www.thegeekstuff.com/2011/12/c-socket-programming/,这是我想出了。

TCPSockets.cpp

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

int createConnection(char *ipaddr) 
{ 
    int sockfd = 0; 
    struct sockaddr_in serv_addr; 

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    { 
     printf("\n Error : Could not create socket \n"); 
     return -1; 
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_port = htons(5000); 

    if(inet_pton(AF_INET, ipaddr, &serv_addr.sin_addr)<=0) 
    { 
     printf("\n inet_pton error occured\n"); 
     return -1; 
    } 

    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
    { 
     printf("\n Error : Connect Failed \n"); 
     return -1; 
    } 

    return sockfd; 
} 

void receiveMessage(int sockfd) 
{ 
    int n = 0; 
    char recvBuff[1024]; 

    memset(recvBuff, '0',sizeof(recvBuff)); 

    while ((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0) 
    { 
     std::cout<<"recvBuff="<<recvBuff<<std::endl; 
     recvBuff[n] = 0; 
     if(fputs(recvBuff, stdout) == EOF) 
     { 
      printf("\n Error : Fputs error\n"); 
     } 
    } 

    if(n < 0) 
    { 
     printf("\n Read error \n"); 
    } 
} 

int createListeningSocket() 
{ 
    int listenfd = 0; 
    struct sockaddr_in serv_addr; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0); 
    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    listen(listenfd, 10); 

    return listenfd; 
} 

void sendMessage(int connfd, char * format) { 
    char sendBuff[1025]; 
    memset(sendBuff, '0', sizeof(sendBuff)); 

    snprintf(sendBuff, sizeof(sendBuff), format); 
    write(connfd, sendBuff, strlen(sendBuff)); 
} 

Server.cpp

#include "TCPSockets.cpp" 

int main(int argc, char *argv[]) { 
    std::cout<<"Creating socket..."<<std::endl; 
    int listeningSocketDescriptor = createListeningSocket(); 
    std::cout<<"Socket created."<<std::endl; 

    std::cout<<"Waiting for connection..."<<std::endl; 
    int clientSocketDescriptor = accept(listeningSocketDescriptor, (struct sockaddr*)NULL, NULL); 
    std::cout<<"Connection made."<<std::endl; 

    std::cout<<"Waiting for message..."<<std::endl; 
    receiveMessage(listeningSocketDescriptor); 
    std::cout<<"Message received."<<std::endl; 

    std::cout<<"Sending message..."<<std::endl; 
    sendMessage(clientSocketDescriptor, "From server!"); 
    std::cout<<"Message sent."<<std::endl; 

    std::cout<<"Closing client socket..."<<std::endl; 
    close(clientSocketDescriptor); 
    std::cout<<"Client socket closed."<<std::endl; 

    close(listeningSocketDescriptor); 

    return 0; 
} 

Client.cpp

#include "TCPSockets.cpp" 

int main(int argc, char *argv[]) { 
    if(argc != 2) 
    { 
     printf("\n Usage: %s <ip of server> \n",argv[0]); 
     return 1; 
    } 

    std::cout<<"Creating connection..."<<std::endl; 
    int socketDescriptor = createConnection(argv[1]); 
    if (socketDescriptor < 0) 
    { 
     return 1; 
    } 
    std::cout<<"Connection created."<<std::endl; 

    std::cout<<"Sending message..."<<std::endl; 
    sendMessage(socketDescriptor, "From client!"); 
    std::cout<<"Message sent."<<std::endl; 

    std::cout<<"Waiting for response..."<<std::endl; 
    receiveMessage(socketDescriptor); 
    std::cout<<"Response received."<<std::endl; 

    return 0; 
} 

一切正常,除了服务器接收消息。我究竟做错了什么?

+0

目前还不清楚你在询问什么。如果服务器没有收到请求,那么没有任何工作......但你说*一切工作,除了... *。你能澄清吗? – mins

+1

你没有检查bind()或listen()的返回值,所以如果其中一个调用失败,你就不会知道它。这些调用中的任何一个失败都会阻止您的服务器接受连接。 –

+0

而当你确实发生错误时,打印错误,而不仅仅是“读取错误”。使用'perror()'或'strerror()'返回的字符串。' – EJP

回答

1

你的代码是:

int clientSocketDescriptor = accept(listeningSocketDescriptor, 
               (struct sockaddr*)NULL, NULL); 
receiveMessage(listeningSocketDescriptor); 

但你应该阅读从客户端套接字描述从accept()返回的字节:

int cs = accept(listeningSocketDescriptor, (struct sockaddr*)NULL, NULL); 
receiveMessage(cs); 
listeningSocketDescriptor

没有。

+0

另外,你的'receiveMessage'函数没有任何意义。它与任何类型的消息都没有关系。接收*消息*的代码在哪里? –

+0

@DavidSchwartz作者从socket读取:while((n = read(sockfd,recvBuff,sizeof(recvBuff)-1))> 0) – 4pie0

+0

对。那么决定他是否收到消息或发现消息结束的逻辑在哪里呢?它只是继续阅读,直到出现错误。 –