为什么当我写入socket时它可能是“坏文件号”

时间:2012-03-27 02:20:30

标签: c sockets networking

我从客户端向服务器套接字发送消息时遇到问题。 写入函数返回错误 - 错误的文件编号。这意味着我无权写入此套接字。 但是从另一个客户端我可以写入此套接字,并成功完成。 最有趣的是,当另一个客户端连接到服务器我的(问题)客户端也可以发送消息。

我的客户代码:

SOCKET OnceCommand;
struct sockaddr_in SAddress4;

struct autoC
{
  char buf[4];
  short fromx;
  short fromy;
  short tox;
  short toy;
  char step;
  char cycle;
};
union autocomm{
  char byte[14];
  struct autoC command;
} Command1, Command2;

memset(&SAddress4,0,sizeof(SAddress4));
SAddress4.sin_family = AF_INET;
SAddress4.sin_port = htons(444);
SAddress4.sin_addr.s_addr = inet_addr(RobotsIP[Robot1]);
memset(&(SAddress4.sin_zero),0,8);

if((OnceCommand = socket(AF_INET,SOCK_STREAM,0))!=SOCKET_ERROR)
{
  Err(OnceCommand);
  if(conn = connect(OnceCommand,(struct sockaddr *)&SAddress4,sizeof(struct sockaddr))!=SOCKET_ERROR)
  {
    rc = write(OnceCommand,(char*)Command1.byte,sizeof(Command1.byte));
    if(rc < 0)
    {
      perror("Client-write() error");
      rc = getsockopt(OnceCommand, SOL_SOCKET, SO_ERROR, &temp, &length);
      if(rc == 0)
      {
        Err(OnceCommand);
        perror("SO_ERROR was");
      }
      closesocket(OnceCommand);
    }
    else
    {
      adv_printf("Client-write() is OK\n");
      adv_printf("String successfully sent lol!\n");
    }
    shutdown(OnceCommand,2);
    closesocket(OnceCommand);
  }
}
SO_ERROR中的

是“错误的文件编号”

我在基于ROM-DOS的ADAM-5510微控制器中使用套接字库。

我尝试使用NONBLOCKing套接字来解决这个问题,但select只返回read ready标志。

2 个答案:

答案 0 :(得分:0)

您使用0作为协议。这应该是什么?如果是TCP,请尝试在套接字调用中使用IPPROTO_TCP,即

OnceCommand = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

答案 1 :(得分:0)

问题不在于程序的客户端部分。可能是由于使用advantech套接字库或其他服务器程序接受客户端&#39;连接,但没有数据可读。当我修改服务器程序以仅通过选择接收数据时它开始正常工作。