我编写了一个服务器程序和一个客户端程序,它们与linux ubuntu上的套接字通信。客户端程序输出Received: 艎��
这是我的服务器代码:
/*** tcp_server.c ***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main() {
int sock_fd, new_fd, bytes;
struct sockaddr_in seraddr, cliaddr;
char data[1024];
socklen_t cli_addr_size;
cli_addr_size = sizeof(cliaddr);
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&seraddr, 0, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY); // INADDR_ANY : It received Network Interface that connected server defined interface, htonl :
seraddr.sin_port = htons(5050);
bind(sock_fd, (struct sockaddr *)&seraddr, sizeof(seraddr));
listen(sock_fd, 10);
while (1) {
new_fd = accept(sock_fd, (struct sockaddr *)&cliaddr, &cli_addr_size);
bytes = recv(new_fd, data, 1024, 0);
send(new_fd, data, bytes, 0);
close(new_fd);
}
close(sock_fd);
}
我的客户代码是:
/*** tcp_client.c ***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(int argc, char *argv[]) {
int sock_fd, bytes;
struct sockaddr_in ser_addr;
char *snddata, rcvdata[1024];
snddata = argv[2];
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&ser_addr, 0,sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = inet_addr(argv[1]); // INADDR_ANY : It received Network Interface that connected server defined interface, htonl :
ser_addr.sin_port = htons(5050);
connect(sock_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr));
send(sock_fd, snddata, strlen(snddata), 0);
printf("Received: ");
bytes = recv(sock_fd, rcvdata, 1024, 0);
rcvdata[bytes] = ' ';
printf("%sn", rcvdata);
close(sock_fd);
}
首先,我得到了accept
的参数3的错误,然后我更改了
new_fd = accept(sock_fd, (struct sockaddr *)&cliaddr, sizeof(cliaddr);
但它仍然产生了这个奇怪的词。
尝试更改send((和receive((函数,以便您可以完全控制从缓冲区(data[1024]
(发送多少字节和哪个字节,如本线程中所示:C套接字:recv并发送所有数据,另请参阅Beej的网络编程指南(http://beej.us/guide/bgnet/(
还要确保初始化数据缓冲区:
data[1024] = "";
rcvdata[1024] = "";
或
data[1024];
data[0] = ' ';
rcvdata[1024];
rcvdata[0] = ' ';
,背景在这个线程中:为什么我通过打印字符串来获得这个异常的符号