【发布时间】:2017-01-21 07:52:03
【问题描述】:
我想创建一个可以读取一些数字而不是字符串的套接字,以便我可以对它们执行一些操作。 如何发送整数而不是字符串 这是我目前的程序:
int main(int argc, char *argv[])
{
int sockfd, newsockfd, port, clilen;
struct sockaddr_in serv_addr, cli_addr;
if (argc < 2)
error("ERROR, no port provided\n");
port = atoi(argv[1]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port); //host to network
if (bind(sockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR binding to socket");
listen(sockfd,2);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,(struct sockaddr *)&cli_addr, &clilen);
int n;
void* buffer[256];
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");
printf("Message received:%d\n",d);
n = write(newsockfd,buffer, strlen((char *)buffer));
if (n < 0)
error("ERROR writing back to socket");
return 0;}
我试过这个:
int n= 5;
write(newsockfd,&n, sizeof(int));
但在客户端(也是一个 void* 缓冲区),它似乎没有读取任何内容。谁能帮我解决这个问题?
一种解决方案可能是传递字符串然后转换为 int 等。但这是正确的方法吗?
【问题讨论】:
-
为了便于阅读和理解:1) 遵循公理:每行只有一个语句,并且(最多)每个语句有一个变量声明。 2) 始终缩进代码:在每个(甚至可选的)左大括号'{'之后缩进。在每个(甚至是可选的)右大括号 '}' 之前不缩进。
-
函数:
listen()和accept()需要检查它们的返回值以确保操作成功。 -
发布的代码无法编译。除其他外,它缺少所有需要的
#include语句。当问一个各种各样的问题时:why doesn't my code work,干净编译后的代码很小,但仍然显示问题。 -
假设代码正在接收一个二进制数(可能是 4 或 8 个字节)。这样的数字可以有 NUL 字节。例如,数字 1 将是:
00000001或01000000,具体取决于发送者的字节序。因此,此语句:n = write(newsockfd,buffer, strlen((char *)buffer));将不起作用。建议:n = write(newsockfd,buffer, n)); -
发布的代码使用变量
d,但该变量未在发布的代码中的任何地方定义
标签: c sockets client-server