Facebook Sharer
选择您要替换的背景颜色:
【农历新年】背景图片:
个性化设定
 注册  找回密码
查看: 1482|回复: 2
打印 上一主题 下一主题

關於 Windows Programming 的 問題

[复制链接]

23

主题

0

好友

122

积分

高级会员

Rank: 3Rank: 3Rank: 3

跳转到指定楼层
1#
发表于 2011-12-22 12:36 PM |只看该作者 |倒序浏览
各位大大,我是用 DevC ++ 來編譯的。 主要是實現 Bakery Algorithm 但是編譯的時候 一直 出現

  [Linker error] undefined reference to `ThreadFunc1@4'
  ld returned 1 exit status

這兩個錯誤信息!不懂哪裡出現問題啊,請問怎樣解決 先謝謝大家

對了,如果你們要在 DEV ++ 編譯的話 你們要去 project option -> parameters -> linker 這個地方 add library object 過後在 DEV C 裡面 lib 的 folder 找 libwsock32.a 就可以了
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<winsock.h>
  5. #include<stdbool.h>
  6. #include<windows.h>
  7. #pragma comment(lib,"wsock32.lib")
  8. #define MAXLINE 1024
  9. #define MAXCLIENT 500

  10. DWORD WINAPI ThreadFunc1(PVOID pParam);
  11. CRITICAL_SECTION cs;
  12. int value=0;
  13. int number[MAXCLIENT];
  14. bool choosing[MAXCLIENT];

  15. int main()
  16. {
  17.   SOCKET serv_sd,cli_sd;
  18.   struct sockaddr_in serv,cli;
  19.   int cli_len,n,a;
  20.   WSADATA wsadata;

  21.   
  22.   for(a=0;a<MAXCLIENT;a++)       //let all number be 0
  23.     number[MAXCLIENT]=0;
  24.    
  25.   for(a=0;a<MAXCLIENT;a++)      // let choosing array be 0
  26.     choosing[a]=false;
  27.    
  28.     if(WSAStartup(0x101,(LPWSADATA)&wsadata)!=0)   //check WSAStartup can use or not
  29.     {
  30.        fprintf(stderr,"echo_srv:can't use Winsock DLL\n");
  31.        exit(1);                                          
  32.     }
  33.    
  34.     //open server socket
  35.     serv_sd = socket(AF_INET, SOCK_STREAM, 0); // AF_INET(use IPv4); SOCK_STREAM; 0(use default setting, means TCP)
  36.    
  37.      if(serv_sd==SOCKET_ERROR)
  38.     {
  39.        fprintf(stderr,"echo_srv:can't create the Server Socket\n");
  40.        exit(1);                                          
  41.     }
  42.    
  43.     serv.sin_family=AF_INET;
  44.     serv.sin_port=htons(9780);
  45.     serv.sin_addr.s_addr=0;
  46.    
  47.     if(bind(serv_sd,(LPSOCKADDR)&serv,sizeof(serv))<0)    // bind address to socket
  48.     {
  49.        fprintf(stderr,"echo_srv:can't bind local address\n");
  50.        exit(1);
  51.     }
  52.    
  53.     if(listen(serv_sd ,5)<0)
  54.     {
  55.        fprintf(stderr,"echo_srv:listen() error\n");
  56.        exit(1);
  57.     }
  58.    
  59.     printf("echo_srv:waiting for client\n");
  60.    
  61.    cli_len=sizeof(cli);
  62.    
  63.    while(1)
  64.    {
  65.      if((cli_sd=accept(serv_sd,(struct sockaddr *)&cli,&cli_len))==SOCKET_ERROR)
  66.      {
  67.        fprintf(stderr,"echo_srv:accept() error\n");
  68.        closesocket(cli_sd);
  69.      }
  70.      else
  71.      {
  72.          printf("echo_srv: A client from [%d] come in",cli_sd);
  73.          CreateThread(NULL,0,ThreadFunc1,&cli_sd,0,NULL);
  74.          n=n+1;
  75.      }
  76.    }
  77.    
  78.    closesocket(serv_sd);
  79.    closesocket(cli_sd);
  80.    DeleteCriticalSection(&cs);
  81.    WSACleanup();
  82.    
  83.    int max_number(int number[])    //subprogram of take number
  84.    {
  85.        int max=number[0],index;
  86.       
  87.        for(index=1;index<MAXCLIENT;index++)
  88.        {
  89.           if(max<number[index])
  90.             max=number[index];
  91.        }
  92.        return max;
  93.    }
  94.    
  95.    bool comp(int comp_number,int comp_socket,int now_number, int now_socket) //if more than one user take the same number then compare the ID
  96.    {
  97.         if(comp_number==now_number)
  98.         {
  99.            if(comp_socket<now_socket)
  100.              return true;
  101.            else
  102.              return false;
  103.         }
  104.         else if(comp_number<now_number)
  105.            return true;
  106.         else
  107.            return false;
  108.    }
  109.    
  110.    DWORD WINAPI ThreadFunc1(PVOID pParam)
  111.    {
  112.          int n,temp,j,couter=0;
  113.          char str[MAXLINE], result[MAXLINE], descript[MAXLINE]="is your answer \n\r",line[2]="\n";
  114.          
  115.       
  116.          
  117.          SOCKET temp_socket =*(SOCKET*)pParam;
  118.          while(1)
  119.          {
  120.            if((n=recv(temp_socket,str,MAXLINE,0))==0)
  121.            {
  122.               fprintf(stderr,"echo_srv:[%d] connection closed\n",temp_socket);
  123.                break;
  124.            }
  125.            else if(n==SOCKET_ERROR)
  126.            {
  127.                fprintf(stderr,"echo_srv:recv() error");
  128.                break;
  129.            }
  130.            str[n]='\0';
  131.            
  132.            //temp_socket = thread_Id
  133.            choosing[temp_socket]=true;           // bakery start
  134.            number[temp_socket] = max_number(number) +1 ;
  135.            choosing[temp_socket]=false ;
  136.            for(j=0;j<MAXCLIENT;j++)
  137.            {
  138.               while(choosing[j]);
  139.               while(number[j]!=0 && comp(number[j],j,number[temp_socket],temp_socket));
  140.            }
  141.            // end
  142.            value=value+ (int)str[0]-48;  // let user input convert to int and assign to value
  143.            itoa(value,result,10);      //change integer to string
  144.            strcat(result,descript);    //let result and decript combine
  145.            
  146.            printf("echo_serv:%s add value from socket[%d]\n",str,temp_socket);
  147.            printf("value is : %d\n",value);
  148.            
  149.            send(temp_socket,line,strlen(line),0);
  150.            
  151.            if(send(temp_socket,result,strlen(result),0)==SOCKET_ERROR)
  152.            {
  153.                fprintf(stderr,"echo_srv:connection closed");
  154.                break;
  155.            }
  156.             number[temp_socket]=0;
  157.   
  158.          }
  159.    }
  160. }
复制代码




收藏收藏0

9

主题

1

好友

108

积分

高级会员

Rank: 3Rank: 3Rank: 3

2#
发表于 2011-12-22 10:03 PM |只看该作者
为什么你line 14 bool 会是500 不是只有 1 or 0 的吗? i means true and false only?


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

3#
发表于 2011-12-23 05:54 PM |只看该作者
本帖最后由 Super-Tomato 于 2011-12-23 06:17 PM 编辑
各位大大,我是用 DevC ++ 來編譯的。 主要是實現 Bakery Algorithm 但是編譯的時候 一直 出現

  [Linker error] undefined reference to `ThreadFunc1@4'
  ld returned 1 exit status

這兩個錯誤信息!不懂哪裡出現問題啊,請問怎樣解決 先謝謝大家

對了,如果你們要在 DEV ++ 編譯的話 你們要去 project option -> parameters -> linker 這個地方 add library object 過後在 DEV C 裡面 lib 的 folder 找 libwsock32.a 就可以了
狂天使 发表于 2011-12-22 12:36 PM



1. 你是 create console project 還是 gui project 啊?
2. 没有引用 socket header 下是不需加入 libwsock32.a
3. 這是甚麼参數啊

DWORD WINAPI ThreadFunc1(PVOID pParam);
  SOCKET serv_sd,cli_sd;
CreateThread(NULL,0,ThreadFunc1,cli_sd,0,NULL);


回复

使用道具 举报

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

JBTALKS.CC |联系我们 |隐私政策 |Share

GMT+8, 2024-10-25 06:24 AM , Processed in 0.110956 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

Ultra High-performance Dedicated Server powered by iCore Technology Sdn. Bhd.
Domain Registration | Web Hosting | Email Hosting | Forum Hosting | ECShop Hosting | Dedicated Server | Colocation Services
本论坛言论纯属发表者个人意见,与本论坛立场无关
Copyright © 2003-2012 JBTALKS.CC All Rights Reserved
合作联盟网站:
JBTALKS 马来西亚中文论坛 | JBTALKS我的空间 | ICORE TECHNOLOGY SDN. BHD.
回顶部