VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3019|回复: 10

做不出来就没工作了

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-21 13:00:01 | 显示全部楼层 |阅读模式
公司是做IM的,我才进去,叫我写一些小程序。就是服务端监听,把客户端发给它的字符都显示出来,客户端可能有10万个。运行在win下。
程序是用C++ BUILDER写的。运行的时候报错“socket error”。
代码如下。
我想问2个问题:
1.为什么socket失败?
2.在for循环那里,我想用多线程去处理,如何实现?

#include<winsock2.h>
#include<stdio.h>         

#define PORT 1234
#define SERVER_IP "127.0.0.1"

int main(int argc, char* argv[])
{
    int  sockfd,new_fd;
    struct sockaddr_in  addr;
   

    if(INVALID_SOCKET == (sockfd = socket(AF_INET,SOCK_STREAM,0)))
    {
       printf("socket error\n");
       goto end;
    }

    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port=htons(PORT);
    addr.sin_addr.s_addr = inet_addr(SERVER_IP);


    if(connect(sockfd,(const struct sockaddr FAR*)&addr,sizeof(addr)))
    {
       printf("connect error\n");
       goto end;
    }

    if(listen(sockfd,SOMAXCONN))
    {
       printf("listen error\n");
       goto end;
    }

    for(;;)
    {
       //如何处理
    }

    end:
    system("pause");
    return 0;
}
回复

使用道具 举报

0

主题

25

帖子

19.00

积分

新手上路

Rank: 1

积分
19.00
发表于 2020-1-30 23:00:01 | 显示全部楼层
windows平台下需要用WSAStartup初始化
     #define sockstart(name)  \
                do {\
                        WSADATA name;  \
                        if (WSAStartup(MAKEWORD(1,1) ,&name))  \
                                perror("sockstart") ;  \
                } while(0)

        #define sockend()  WSACleanup()

sockstart(wsad) ;

一台機器10萬個用戶端?
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-31 12:36:01 | 显示全部楼层
加了上面的代码 可以正常的socket了,不过connect那里又失败了

上面的代码是server端
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-31 17:47:58 | 显示全部楼层
socket裸着用吗?有没有找下现成的库或封装
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-31 18:09:01 | 显示全部楼层
多线程有很多很好的设计模式,比如线程池等等,搜一下吧
回复

使用道具 举报

0

主题

18

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-2-1 05:18:01 | 显示全部楼层
我一点也不会,怎么办??
回复

使用道具 举报

0

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-2 12:18:01 | 显示全部楼层
#include<winsock2.h>
#include<stdio.h>         

#define PORT 1234
#define SERVER_IP "127.0.0.1"

int main(int argc, char* argv[])
{
    int  sockfd,new_fd;
    struct sockaddr_in  addr;
   

    if(INVALID_SOCKET == (sockfd = socket(AF_INET,SOCK_STREAM,0)))//这条件?
    {
       printf("socket error\n");
       goto end;
    }

    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port=htons(PORT);
    addr.sin_addr.s_addr = inet_addr(SERVER_IP);


    if(connect(sockfd,(const struct sockaddr FAR*)&addr,sizeof(addr)))
//服务端首先bind connect?
    {
       printf("connect error\n");
       goto end;
    }

    if(listen(sockfd,SOMAXCONN))
    {
       printf("listen error\n");
       goto end;
    }
//创建线程  进行接受与发送
    for(;;)
    {
       //如何处理
    }

    end:
    system("pause");
    return 0;
}
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-2-14 11:30:02 | 显示全部楼层
修改了一下把connect换成bind,就好了。

现在的代码大概是这样了:

void mythread(void * arg)
{
      char buffer[MAX_LENGTH];
      int  sockfd = *(SOCKET*)arg;
      recv (sockfd,buffer,MAX_LENGTH,0);     
      printf("%s\n",buffer);
      _endthread();
}

main()
{
   //do something

   for(;;)
    {
        new_fd = accept(sockfd,0,0);  
        if(INVALID_SOCKET != new_fd)
        {
            _beginthread(mythread,0,&new_fd);
        }
        else
        {
            printf("wait \n");
        }
    }//end for
  
    closesocket(sockfd);
}

我的问题是
1。要不要在beginthread之前关闭sockfd
2。新建一个线程的方式对不对
3。如果没连接的时候,accept被不停的调用,不断的输出"wait",这样消耗资源,
   如何让accept阻塞,等到有连接才继续下去。
回复

使用道具 举报

1

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-14 17:00:01 | 显示全部楼层
学习.但是我这样写的就是阻塞的.

#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>

void main()
{
        struct sockaddr_in test;
        struct sockaddr_in re;
        FILE *p = NULL;
        SOCKET test1,test2;
        int a,b;
        WORD wVersion=MAKEWORD(2,0);
        WSADATA wsData;

        char buff[60];
        int nResult= WSAStartup(wVersion,&wsData);

        test. sin_port= 4000;//保证字节顺序
        test. sin_addr.s_addr= htonl(INADDR_ANY);
        test.sin_family = AF_INET;
        b = sizeof(struct sockaddr_in);
        test1 = socket(AF_INET,SOCK_STREAM,0);

        if(test1 == INVALID_SOCKET)
        {
                exit(0);
        }

        a =        bind(test1,(struct sockaddr *)&test,sizeof(struct sockaddr));
        if( 0 != a)
        {
                printf("bind err\n");
                exit(0);
        }


        a = listen(test1,1);

        test2 = accept(test1,(struct sockaddr *)&re,&b);
        if (test2 != INVALID_SOCKET)
        {
                printf("connt\n");
        }

        p = fopen("test.exe","wb+");

        while(1)
        {
                a = recv(test2,&buff[0],50,0);
               
                if (0 == a)
                {
                        a = WSAGetLastError();
                        printf("recv err\n");
                        exit(0);
                }else
                {
                        fwrite(buff,50,1,p);
                        printf("%s\n",buff);
                }
        }

        a = send(test2,&buff[0],sizeof(buff),0);

        test2 = accept(test1,(struct sockaddr *)&re,&b);

}
回复

使用道具 举报

0

主题

57

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-3-1 21:45:01 | 显示全部楼层
Windows下可以尝试完成端口,线程池什么的,系统来调度
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表