以下是我提出的以下基本套接字代码:
//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运行?
答案 0 :(得分:24)
以下是您需要通过TCP传输数据的更改
创建套接字时传递正确的参数。在上面的示例中,您传递了SOCK_DGRAM而不是传递SOCK_STREAM。
绑定服务器后应进入监听模式(查看listen的手册页) 客户端应在创建套接字后连接。
然后听完后在服务器端接受。
最终读写传输数据
附图将为您提供TCP连接的清晰图片
您可以查看手册页以获取有关所有功能的详细信息,或参阅beej的套接字编程指南(使用this链接)
答案 1 :(得分:7)
将SOCK_DGRAM
替换为SOCK_STREAM
。
另外,read the manual或获得good book。