c - send() 函数在客户端返回错误地址错误
问题描述
标题对正在发生的事情是不言自明的,对我来说奇怪的是没有像connect()
,之类的其他功能accept()
,其他人正在返回这个。
这是我的完整代码:
客户:
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include<errno.h>
#define PORT 8080
int main(int argc, char const *argv[])
{
int sock = 0, valread;
struct sockaddr_in serv_addr;
int buffer[1024];
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0)
{
perror("Invalid address \n");
return -1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
perror("Connection Failed \n");
return -1;
}
int i, array[argc], countsize;
if(argc>=2){
for(i=1; i<argc; i++) {
int number=atoi(argv[i]);
array[i-1]=number;
countsize++;
}
if(send(sock, array, countsize*sizeof(int), 0)<0)
{
printf("Error in send! %s\n", strerror(errno)); //error is happening here
return -1;
}
}
return 0;
}
服务器:
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include<errno.h>
#define PORT 8080
int main()
{
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
int buffer;
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR , &opt, sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0)
{
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
int arguments[10]={0};
int n = recv(new_socket, arguments ,1024*sizeof(int),0);
puts("The client sent the arguments: ");
int j;
for(j=0; j<n/sizeof(int);j++){
printf("%d", arguments[j]);
puts(".");
}
return 0;
}
我尝试使用write()
以及我更熟悉它的语法(即使我仔细检查了语法send()
并且它返回了相同的错误,知道出了什么问题吗?
解决方案
问题出在这段代码中:
int i, array[argc], countsize;
if(argc>=2){
for(i=1; i<argc; i++) {
int number=atoi(argv[i]);
array[i-1]=number;
countsize++;
}
countsize
未初始化,这意味着它的值是不确定的。然后,您尝试在为其分配任何值之前对其进行递增。读取具有不确定值且从未获得其地址的变量会调用未定义的行为。
您想将此变量初始化为 0,以便从已知点开始计数。
int i, array[argc], countsize = 0;
推荐阅读
- java - 为什么这个无限循环
- javascript - 如何使用javascript动态移动对象
- cloud - 事件驱动架构——如何更高效?
- javascript - 这是什么数据格式,如何将其转换为可读文本?
- mongodb - Mongoose 在传递多个主机时抛出错误
- jenkins - 使用 naginator-plugin 在 Jenkins 中重试失败作业时如何保持相同的节点
- ios - 如何从情节提要中从 xib 到视图控制器?
- reactjs - 无法将“已连接”的 HOC 与反应路由器一起使用
- python - 我的程序不断发送垃圾邮件打印功能 Python
- node.js - 如何在 Node.js 中构建一个类来抽象 RabbitMQ 和 amqplib 功能