- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个用于 C 套接字编程的小型演示应用程序,但在连接到本地计算机上托管的服务器应用程序时遇到了问题。当我调用 connect() 时,我返回 errno 22,它是 EINVAL,我无法弄清楚哪个参数无效以及为什么它无效。
我不确定是什么导致了这个错误。我已经检查了我所做的所有调用的手册页,并查看了大约六个教程,据我所知,我似乎没有遗漏任何部分。
(顺便说一句,我正在使用 gcc 来编译应用程序)
谁能帮帮我?
客户端.c
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <errno.h>
#define ARGBUF_SIZE 256
#define MAX_BUF 1024
void
post_error(const char* inMsg)
{
fprintf(stderr, "%s\n", inMsg);
perror("errno is ");
fflush(stderr);
exit(-1);
}
int
open_tcp(void)
{
return socket(PF_INET, SOCK_STREAM, 0);
}
int
open_udp(void)
{
return socket(PF_INET, SOCK_DGRAM, 0);
}
int
open_connection(const char* connectionType, struct sockaddr_in* target)
{
int handle = -1;
if (strcmp(connectionType, "tcp") == 0)
handle = open_tcp();
else if (strcmp(connectionType, "udp") == 0)
handle = open_udp();
else
post_error("error: invalid arguments - connection type can only be either \"tcp\" or \"udp\"");
/* attempt connection */
int result = connect(handle, (struct sockaddr*)&target, sizeof(target));
/* inspect errno for more information on the error */
/*
* this switch is unneeded since perror dumps the string for errno
* but it is useful for debugging
*/
fprintf(stdout, "errno is ");
switch (errno)
{
case EACCES:
fprintf(stdout, "EACCESS");
break;
case EPERM:
fprintf(stdout, "EPERM");
break;
case EADDRINUSE:
fprintf(stdout, "EADDRINUSE");
break;
case EAFNOSUPPORT:
fprintf(stdout, "EAFNOSUPPORT");
break;
case EAGAIN:
fprintf(stdout, "EAGAIN");
break;
case EALREADY:
fprintf(stdout, "EALREADY");
break;
case EBADF:
fprintf(stdout, "EBADF");
break;
case ECONNREFUSED:
fprintf(stdout, "ECONNREFUSED");
break;
case EFAULT:
fprintf(stdout, "EFAULT");
break;
case EINPROGRESS:
fprintf(stdout, "EINPROGRESS");
break;
case EINTR:
fprintf(stdout, "EINTR");
break;
case EISCONN:
fprintf(stdout, "EISCONN");
break;
case ENETUNREACH:
fprintf(stdout, "ENETUNREACH");
break;
case ENOTSOCK:
fprintf(stdout, "ENOTSOCK");
break;
case ETIMEDOUT:
fprintf(stdout, "ETIMEDOUT");
break;
default:
fprintf(stdout, "unknown error(%d)", errno);
break;
}
fprintf(stdout, "\n");
fflush(stdout);
if (result < 0)
post_error("error: invalid arguments? - connection failed");
printf("connection made");
return handle;
}
int
main(int argc, char* argv[])
{
int handle;
struct sockaddr_in target;
if (argc != 4)
post_error("usage: socket_client [tcp | udp] [server ip] [port number]");
/* argv[0] is expected to be sockcn the name of this executable */
memset(&target, 0, sizeof(target));
target.sin_family = AF_INET;
in_addr_t addr;
int result = inet_aton(argv[2], &addr);
if (result == INADDR_NONE)
post_error("error: invalid arguments - failed to convert ip address from string format");
target.sin_addr.s_addr = addr;
target.sin_port = htons(atoi(argv[3]));
handle = open_connection(argv[1], &target);
char buffer[MAX_BUF];
while (1)
{
printf("> ");
/* wait for input from user in faux-prompt and send to connection */
fgets(buffer, MAX_BUF, stdin);
if (strcmp(buffer, "exit\n") == 0)
break;
unsigned int len = strlen(buffer);
if (send(handle, buffer, len, 0) != len)
post_error("error: bytes sent is not the same as the size of the message");
}
close(handle);
return 0;
}
服务器.c
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define MAX_BUF 256
void
post_error(const char* inMsg)
{
fprintf(stderr, "%s", inMsg);
perror("errno is ");
exit(-1);
}
void
handle_client(int client)
{
char buffer[MAX_BUF];
int received = -1;
/* receive message */
received = recv(client, buffer, MAX_BUF, 0);
if (received < 0)
post_error("error: connection - failed to receive initial bytes from client");
while (received > 0)
{
printf("%s", buffer);
received = recv(client, buffer, MAX_BUF, 0);
if (received < 0)
post_error("error: connection - failed to received pending bytes from client");
}
close(client);
}
int
open_tcp(void)
{
return socket(AF_INET, SOCK_STREAM, 0);
}
int
open_udp(void)
{
return socket(AF_INET, SOCK_DGRAM, 0);
}
int
main(int argc, char* argv[])
{
int serverHandle;
int clientHandle;
struct sockaddr_in server;
struct sockaddr_in client;
if (argc != 3)
post_error("usage: server [tcp or udp] [port number]");
int udp;
if (strcmp(argv[1], "tcp") == 0)
{
udp = 0;
serverHandle = open_tcp();
}
else if (strcmp(argv[1], "udp") == 0)
{
udp = 1;
serverHandle = open_udp();
}
else
{
post_error("error: invalid arguments - first argument must be either \"tcp\" or \"udp\"");
}
/* construct the server struct */
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; // htonl(INADDR_ANY);
server.sin_port = htons(atoi(argv[2]));
/* bind is used for server compared to connect for clients */
if (bind(serverHandle, (struct sockaddr*)&server, sizeof(server)) < 0)
post_error("error: failed to bind to target port");
if (!udp)
{
/* listen to start receiving messages */
if (listen(serverHandle, 1) < 0)
post_error("error: failed to listen on bound port");
}
fprintf(stdout, "server initialized.\nwaiting for messages...\n");
fflush(stdout);
/* now just wait for messages to come in */
/* the if should really be outside the while to avoid checking 'udp' every iteration but this seems fairly clear of the intention */
while (1)
{
if (udp)
{
char buffer[MAX_BUF];
socklen_t len = sizeof(client);
ssize_t received = recvfrom(serverHandle, buffer, MAX_BUF, 0, (struct sockaddr*)&client, &len);
fprintf(stdout, "> %s", buffer);
fflush(stdout);
}
else
{
/* wait for connection */
socklen_t len = sizeof(client);
if (clientHandle = accept(serverHandle, (struct sockaddr*)&client, &len) < 0)
post_error("error: failed to accept client connection");
fprintf(stdout, "client connected: %s\n", inet_ntoa(client.sin_addr));
fflush(stdout);
handle_client(clientHandle);
}
}
}
服务器使用 ./server tcp 65000 运行客户端使用 ./client tcp 65000 运行
最佳答案
错误在这一行:
int result = connect(handle, (struct sockaddr*)&target, sizeof(target));
target
已经是您正在获取地址的指针类型。尝试
int result = connect(handle, (struct sockaddr*)target, sizeof(*target));
请注意微妙的sizeof(*target)
。
关于c - socket connect() 返回 errno EINVAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24141307/
基于 socket.io 的官方网站 http://socket.io/#how-to-use , 我找不到任何术语。socket.emit 、 socket.on 和 socket.send 之间有
我正在使用 lua-socket 3.0rc1.3(Ubuntu Trusty 附带)和 lua 5.1。我正在尝试监听 unix 域套接字,我能找到的唯一示例代码是 this -- send std
这两者有什么区别? 我注意到如果我在一个工作程序中从 socket.emit 更改为 socket.send ,服务器无法接收到消息,虽然我不明白为什么。 我还注意到,在我的程序中,如果我从 sock
使用套接字在两台服务器之间发送数据是个好主意,还是应该使用 MQ 之类的东西来移动数据。 我的问题:套接字是否可靠,如果我只需要一次/有保证的数据传输? 还有其他解决方案吗? 谢谢。 最佳答案 套接字
引自 this socket tutorial : Sockets come in two primary flavors. An active socket is connected to a
我已经安装了在端口81上运行的流服务器“Lighttpd”(light-tpd)。 我有一个C程序,它使用套接字api创建的服务器套接字在端口80上监听http请求。 我希望从客户端收到端口80上的请
这是我正在尝试做的事情: 当有新消息可用时,服务器会将消息发送给已连接的客户端。另一方面,客户端在连接时尝试使用send()向服务器发送消息,然后使用recv()接收消息,此后,客户端调用close(
如何将消息发送到动态 session 室,以及当服务器收到该消息时,如何将该消息发送到其他成员所在的同一个 session 室? table_id是房间,它将动态设置。 客户: var table_i
这是我尝试但不起作用的方法。我可以将传入的消息从WebSocket连接转发到NetSocket,但是只有NetSocket收到的第一个消息才到达WebSocket后面的客户端。 const WebSo
我正在实现使用boost将xml发送到客户端的服务器。我面临的问题是缓冲区不会立即发送并累积到一个点,然后发送整个内容。这在我的客户端造成了一个问题,当它解析xml时,它可能具有不完整的xml标记(不
尝试使用Nginx代理Gunicorn套接字。 /etc/systemd/system/gunicorn.service文件 [Unit] Description=gunicorn daemon Af
我正在使用Lua套接字和TCP制作像聊天客户端和服务器这样的IRC。我要弄清楚的主要事情是如何使客户端和服务器监听消息并同时发送它们。由于在服务器上执行socket:accept()时,它将暂停程序,
我看了一下ZMQ PUSH/PULL套接字,尽管我非常喜欢简单性(特别是与我现在正在通过UDP套接字在系统中实现的自定义碎片/ack相比),但我还是希望有自定义负载平衡功能,而不是幼稚的回合-robi
我正在编写一个应用程序,其中有多个 socket.io 自定义事件,并且所有工作正常,除了这个: socket.on("incomingImg", function(data) {
在我的应用程序中,我向服务器发送了两条小消息(类似 memcached 的服务)。在类似 Python 的伪代码中,这看起来像: sock.send("add some-key 0") ignored
很抱歉再次发布此问题,但大多数相关帖子都没有回答我的问题。我在使用 socket.io 的多个连接时遇到问题我没有使用“socket.socket.connect”方法,但我从第一次连接中得到了反馈。
我尝试使用 socket.io 客户端连接到非 socket.io websocket 服务器。但我做不到。我正在尝试像这样连接到套接字服务器: var socket = io.connect('ws
我遇到了一个奇怪的问题。在我非常基本的服务器中,我有: server.listen(8001); io.listen(server); var sockets = io.sockets; 不幸的是,套
我正在使用带套接字 io 的sailsjs。帆的版本是 0.10.5。我有以下套接字客户端进行测试: var socketIOClient = require('socket.io-client');
这个问题在这里已经有了答案: What is the fundamental difference between WebSockets and pure TCP? (4 个答案) 关闭 4 年前。
我是一名优秀的程序员,十分优秀!