2013-05-10 33 views
11

下面是我想出了以下基本套接字代码:创建一个基本的C/C++ TCP套接字作家

//General includes: 
#include <iostream> 
#include <stdio.h> 
#include <string> 

//Network related includes: 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 

//Target host details: 
#define PORT 1234 
#define HOST "74.74.74.74" 

using namespace std; 

//Function prototypes: 
string MessageFormat(int, char**); 
void MessageSend(string); 

int main(int argc, char *argv[]) 
{ 
    //Parse arguments and format message: 
    string message = MessageFormat(argc, argv); 

    //Send the message out: 
    MessageSend(message); 

    return 0; 
} 

string MessageFormat(int argc, char *argv[]) 
{ 
    //Massage the command line parameters 
    // into my desired payload format. 

    return message; 
} 

void MessageSend(string message) 
{ 
    int sd, ret; 
    struct sockaddr_in server; 
    struct in_addr ipv4addr; 
    struct hostent *hp; 

    sd = socket(AF_INET,SOCK_DGRAM,0); 
    server.sin_family = AF_INET; 

    inet_pton(AF_INET, HOST, &ipv4addr); 
    hp = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET); 
    //hp = gethostbyname(HOST); 

    bcopy(hp->h_addr, &(server.sin_addr.s_addr), hp->h_length); 
    server.sin_port = htons(PORT); 

    connect(sd, (const sockaddr *)&server, sizeof(server)); 
    send(sd, (char *)message.c_str(), strlen((char *)message.c_str()), 0); 
} 

这是很基本的,是实际可行的。但是,它发送的是UDP数据包而不是TCP数据包,所以期望TCP的目标主机会拒绝这些数据包。另外,通过检查连接/发送值以及使用ngrep观看我的接口,我可以100%验证数据包是否正在发送,所以这不是问题。

我只是想修改我拥有的东西,而不是用boost asio创建一个全功能的服务器。我怎样才能调整它,使它在TCP而不是UDP方面运行?

+3

将'SOCK_DGRAM'改为'SOCK_STREAM '。 (线索:UDP =用户**数据报**协议)。 – BoBTFish 2013-05-10 16:08:00

+1

当然。谢谢。 – kmarks2 2013-05-10 16:12:24

回答

22

以下是你需要做出改变,通过TCP

传输数据
  1. 在创建。在例子中,你通过SOCK_DGRAM,而不是通过上面的SOCK_STREAM插座通正确的参数。

  2. 绑定服务器进入监听模式后(请查看listen的手册页) ,而客户端应该在套接字创建后连接。

  3. 然后在服务器端接听后。

  4. 最后的读取和写入数据传输

    附加会给你的TCP连接的清晰画面

    TCP Socket programming

    您可以检查所有功能的详细信息手册页

图或者reeer beej的socket编程指南(使用this链接)