俺的winsock server为啥发出的包都是checksum错误呢?

wxb 2006-12-25 01:32:44
俺用winsock编了一个小server程序,试图和NowSMS Server通信,以实现模拟部分SMSC功能


实现上我的server程序(简称A)作为server,NowSMS(一个第三方软件)作为client,和
A通信。目前A可以接收到NowSMS发来的消息,但在A给NowSMS返回response(就是通过调用
winsock里面的send函数发一个包)的时候,从ethereal里面看到A发出的包的checksum是错
误的。是不是在调用send发包之前还需要再调用某些函数重新计算一下checksum呢?感觉计
算checksum这一步骤应该就是send来完成的(不知我的理解对不对)。我查了一下MSDN,没
看到winsock里面有计算checksum相关的函数。

请大侠指点一下!多谢啦!
...全文
153 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxb 2006-12-25
  • 打赏
  • 举报
回复
理论上,不管我往SMPP的PDU里面填入什么内容,然后发送出去,都不应该引起checksum出错吧。checksum应该是根据要发送的内容算出来的啊。
wxb 2006-12-25
  • 打赏
  • 举报
回复
应该和smpp*函数无关的。那些只是对SMPP的PDU进行一些处理
DentistryDoctor 2006-12-25
  • 打赏
  • 举报
回复
不知与你的smpp*的函数有关?
wxb 2006-12-25
  • 打赏
  • 举报
回复
自己顶,顺便贴代码:

UINT server_thread(LPVOID pParam)
{
SOCKET server;
WSADATA wsa_data;
sockaddr_in local;
int wsaret = WSAStartup(0x0202, &wsa_data);
std::cout << "Highest winsock API version supported on this Windows OS: " << wsa_data.wHighVersion << std::endl;
if(wsaret != 0){
std::cout << "WSAStartup error code: " << WSAGetLastError() << std::endl;
}

local.sin_family = AF_INET; //Address family
local.sin_addr.s_addr = INADDR_ANY; //Wild card IP address
local.sin_port = htons((u_short)1007); //port to use return 0;

server = socket(AF_INET, SOCK_STREAM, 0);
if(server == INVALID_SOCKET){
std::cout << "socket function error code: " << WSAGetLastError() << std::endl;
}

if(bind(server, (sockaddr*)&local, sizeof(local))!=0){
std::cout << "bind function error code: " << WSAGetLastError() << std::endl;
}

if(listen(server, SOMAXCONN) != 0){
std::cout << "listen function error code: " << WSAGetLastError() << std::endl;
}

SOCKET established_conn;
sockaddr_in client_addr;
int client_addr_len = sizeof(client_addr);
char packet_received[REC_BUFF_LEN];
int cmd_id;
void* pdu_received;
void* pdu_send;
int errcode;
int command_length;
int command_id;
int command_status;
int sequence_number;
while(true){
established_conn = accept(server, (struct sockaddr*)&client_addr, &client_addr_len);
if(established_conn == INVALID_SOCKET){
std::cout << "accept function error: " << WSAGetLastError() << std::endl;
}
std::cout << "incoming connection accepted from " << inet_ntoa(client_addr.sin_addr) << std::endl;
errcode = recv(established_conn, packet_received, REC_BUFF_LEN, 0);
if(errcode < 0){
std::cout << "recv function error: " << WSAGetLastError() << std::endl;
}
cmd_id = smpp_pdu_type_detect(packet_received, REC_BUFF_LEN);
switch(cmd_id){
case BIND_TRANSMITTER:
pdu_received = new PDU_BIND_TRANSMITTER;
smpp_pdu_parse(cmd_id, packet_received, REC_BUFF_LEN, pdu_received);
smpp_pdu_print(cmd_id, pdu_received);
pdu_send = new PDU_BIND_TRANSMITTER_RESP;
command_length = 32; buff_reverse((char*)&command_length, 4);
((PDU_BIND_TRANSMITTER_RESP*)pdu_send)->header.command_length = command_length;
command_id = BIND_TRANSMITTER_RESP; buff_reverse((char*)&command_id, 4);
((PDU_BIND_TRANSMITTER_RESP*)pdu_send)->header.command_id = command_id;
command_status = ESME_ROK; buff_reverse((char*)&command_status, 4);
((PDU_BIND_TRANSMITTER_RESP*)pdu_send)->header.command_status = command_status;
sequence_number = ((PDU_BIND_TRANSMITTER*)pdu_received)->header.sequence_number; buff_reverse((char*)&sequence_number, 4);
((PDU_BIND_TRANSMITTER_RESP*)pdu_send)->header.sequence_number = sequence_number;
strcpy(((PDU_BIND_TRANSMITTER_RESP*)pdu_send)->system_id, "SMSC for AA");
errcode = send(established_conn, (char*)pdu_send, 32, NULL);
delete pdu_received;
delete pdu_send;
break;
case ENQUIRE_LINK:
pdu_received = new PDU_ENQUIRE_LINK;
smpp_pdu_parse(cmd_id, packet_received, REC_BUFF_LEN, pdu_received);
smpp_pdu_print(cmd_id, pdu_received);
pdu_send = new PDU_BIND_TRANSMITTER_RESP;
command_length = 16; buff_reverse((char*)&command_length, 4);
((PDU_ENQUIRE_LINK_RESP*)pdu_send)->header.command_length = command_length;
command_id = ENQUIRE_LINK_RESP; buff_reverse((char*)&command_id, 4);
((PDU_ENQUIRE_LINK_RESP*)pdu_send)->header.command_id = command_id;
command_status = ESME_ROK; buff_reverse((char*)&command_status, 4);
((PDU_ENQUIRE_LINK_RESP*)pdu_send)->header.command_status = command_status;
sequence_number = ((PDU_ENQUIRE_LINK*)pdu_received)->header.sequence_number; buff_reverse((char*)&sequence_number, 4);
((PDU_ENQUIRE_LINK_RESP*)pdu_send)->header.sequence_number = sequence_number;
errcode = send(established_conn, (char*)pdu_send, 32, NULL);
delete pdu_received;
delete pdu_send;
default:
break;
}
// closesocket(established_conn);
}

return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Press ESCAPE to terminate program\r\n";
AfxBeginThread(server_thread,0);
while(getchar()!=27);

return 0;
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧