LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 906|回复: 9

菜鸟Socket通讯一问

[复制链接]
发表于 2005-1-13 15:51:45 | 显示全部楼层 |阅读模式
最近正在学习Linux下网络编程
我用的环境是:Red Flag Linux 4.1+gcc
在论坛上找了个程序,j经过编译
先执行了Server.c,再执行Client.c
在客户机一段可以出现
Servername:***Received:
服务器一段没有任何反映
不知是程序哪里出了问题
代码如下:
服务器段代码//Server.c
【code】
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "sys/socket.h"
#include "sys/wait.h"

#define SERVERPORT 8222
#define BACKLOG 10

int main(){
    printf("starting");
    int sockfd,clientfd,flag=0;
    struct sockaddr_in my_addr;
    struct sockaddr_in remote_addr;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
        printf("socket创建出错\n");
        exit(1);
    }
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(SERVERPORT);
    my_addr.sin_addr.s_addr=INADDR_ANY;
    bzero(&(my_addr.sin_zero),8);
    if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
        printf("bind出错\n");
        exit(1);
    }
    if(listen(sockfd,BACKLOG)==-1){
        printf("listen出错\n");
        exit(1);
    }
    printf("begining");
    while(1){
        flag=flag+1;
        printf("Server:%d",&flag);
        if((clientfd=accept(sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr_in)))==-1){
            printf("accept出错");
            close(clientfd);
            continue;   
        }
        printf("received a connetion from %s\n",inet_ntoa(remote_addr.sin_addr));
        if(!fork()){
            if(send(clientfd,"Hello,you are connected!\n",26,0)==-1){
                printf("send出错");
            }
            close(clientfd);
            exit(0);
        }
        close(clientfd);
        printf("ending");
    }
}




【/code】

客户机段代码//Client.c
【code】
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "netdb.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "sys/socket.h"

# define SERVPORT 8222
# define MAXDATASIZE 100

int main(){
    int sockfd,recvbytes;
    char buff[MAXDATASIZE];
    struct hostent *host=gethostbyname("192.168.101.254");
    struct sockaddr_in serv_addr;
    printf("ServerName:%s",host);
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
        printf("socket创建出错!");
        exit(1);
    }
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(SERVPORT);
    serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
    bzero(&serv_addr.sin_zero,8);
    if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){
        printf("connect出错");
        exit(1);     
    }
    if((recvbytes=recv(sockfd,buff,MAXDATASIZE,0))==-1){
        printf("recv出错");
        exit(1);
    }
    buff[recvbytes]='\0';
    printf("Receied:%s\n",buff);
    close(sockfd);
}
      


【/code】
发表于 2005-1-13 16:12:18 | 显示全部楼层
是不是LOCAL设置有问题, 不能显示中文哦

可以用gcc -g 编译, 然后调试看看哪里出错了
 楼主| 发表于 2005-1-13 16:15:19 | 显示全部楼层
谢谢你的回帖。
你说local设置有问题?
这个不太明白。:)
发表于 2005-1-13 16:33:03 | 显示全部楼层
在运行程序的终端上面输入 export LANG=C

然后再试试!

是程序停止不动了,还是打印出错信息后回到shell提示符?
 楼主| 发表于 2005-1-13 16:37:32 | 显示全部楼层
Server一端程序没有任何反应,
一点输出都没有
连程序刚开始的“Starting”都输不出来
发表于 2005-1-13 16:45:14 | 显示全部楼层
你的server.c里面变量定义放在printf()执行函数之后的也能编译通过吗?
发表于 2005-1-13 16:48:26 | 显示全部楼层
有段代码,你参考一下


  1. #include <sys/socket.h>                                                /* socket(), bind(), ... */
  2. #include <netinet/in.h>                                                /* INADDR_ANY */
  3. #include <arpa/inet.h>                                                /* inet_addr() */
  4. #include "socket_op.h"

  5. typedef int errcode_t;

  6. errcode_t socket_open(int *sockfd)
  7. {
  8.         struct sockaddr_in local_addr;
  9.         int local_fd;
  10.         errcode_t retval = 0;

  11.         /* socked creation */
  12.         local_fd = socket(AF_INET, SOCK_DGRAM, 0);
  13.         if (local_fd < 0) {
  14.                 fprintf(stderr, "can't open socket\n");
  15.                 retval = 1;
  16.                 goto returnval;
  17.         }

  18.         /* form LOCAL_addr AND bind server port */
  19.         local_addr.sin_family        = AF_INET;
  20.         local_addr.sin_port        = htons(LOCAL_SERVER_PORT);
  21.         local_addr.sin_addr.s_addr= htonl(INADDR_ANY);
  22.         memset(&(local_addr.sin_zero), '\0', 8);
  23.         retval = bind(local_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr));
  24.         if (retval < 0) {
  25.                 fprintf(stderr, "can't bind port number: %d\n", LOCAL_SERVER_PORT);
  26.                 retval = 1;
  27.                 goto returnval;
  28.         }

  29.         printf("socket opened successfully on port:%d\n", LOCAL_SERVER_PORT);
  30.         *sockfd = local_fd;

  31. returnval:
  32.         return retval;
  33. }

  34. errcode_t socket_send(int sockfd, char *command)
  35. {
  36.         struct sockaddr_in ssg_addr;
  37.         int sended;
  38.         errcode_t retval = 0;
  39.        
  40.         ssg_addr.sin_family        = AF_INET;
  41.         ssg_addr.sin_port        = htons(SSG_SERVER_PORT);
  42.         ssg_addr.sin_addr.s_addr = inet_addr(SSG_SERVER_IP);
  43.         memset(&(ssg_addr.sin_zero), '\0', 8);
  44.         sended = sendto(sockfd, command, strlen(command)+1,  0, (struct sockaddr *)&ssg_addr, sizeof(ssg_addr));
  45.         if (sended < 0) {
  46.                 fprintf(stderr, "can't send command '%s' to %s:%d\n", command, SSG_SERVER_IP, SSG_SERVER_PORT);
  47.                 retval = 1;
  48.         } else {
  49.                 printf("command '%s' sended to %s:%d successfully\n", command, SSG_SERVER_IP, SSG_SERVER_PORT);
  50.         }
  51.        
  52.         return retval;
  53. }

  54. errcode_t socket_rcv(int sockfd, char *msg)
  55. {
  56.         struct sockaddr_in cli_addr;
  57.         int cli_len, received;
  58.         errcode_t retval = 0;
  59.        
  60.         cli_len = sizeof(cli_addr);
  61.         received= recvfrom(sockfd, msg, MAX_MSG, 0, (struct sockaddr *)&cli_addr, &cli_len);
  62.         if (received < 0) {
  63.                 fprintf(stderr, "can't receive data\n");
  64.                 retval = 1;
  65.         }

  66.         return retval;
  67. }

复制代码
发表于 2005-1-19 13:54:24 | 显示全部楼层

The code is modification on your!

server.c
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "sys/socket.h"
#include "sys/wait.h"

#define SERVERPORT 8222
#define BACKLOG 10

int main(int argc , char *argv[])
{
        printf("starting\n");
        int sockfd,clientfd,cli_len,readlen;
        char readcontent[1024];
        struct sockaddr_in my_addr;
        struct sockaddr_in remote_addr;
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                printf("socket创建出错\n");
                exit(1);
        }
        printf("The socket is create sucessful!\n");
        my_addr.sin_family=AF_INET;
        my_addr.sin_port=htons(SERVERPORT);
        my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        //bzero(&(my_addr.sin_zero),8);
        printf("This is bing start!\n");
        if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) < 0)
        {
                printf("bind出错\n");
                exit(1);
        }
        printf("This is listen start!\n");
        if(listen(sockfd,BACKLOG) < 0)
        {
                printf("listen出错\n");
                exit(1);
        }
        printf("The listen is ok\n");
        printf("begining\n");
        while(1)
        {
                printf("begining too\n");
                cli_len = sizeof(remote_addr);
                clientfd=accept(sockfd,(struct sockaddr *)&remote_addr,&cli_len);
                if(clientfd < 0)
                {
                        printf("accept出错\n");
                        close(clientfd);
                        exit(1);
                }
                char buff[]={"Hello,you are connected!\n"};
                if((readlen = read(clientfd,readcontent,1024)) < 0)
                {
                        printf("There is wrong to read!\n");
                        exit(1);                       
                }
                printf("%s\n",readcontent);
                if(write(clientfd,buff,1024) < 0)
                {
                        printf("send出错");
                        exit(1);
                }
                printf("ending\n");
        }
}


client.c
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "string.h"
#include "netdb.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "sys/socket.h"

# define SERVPORT 8222
# define MAXDATASIZE 100

int main()
{
        int sockfd,recvbytes,writelen;
        socklen_t servlen;
        char buff[MAXDATASIZE];
        char writetemp[MAXDATASIZE] = {"Hehe,connect is ok!\n"};
        //struct hostent *host=gethostbyname("192.168.101.254");
        struct sockaddr_in serv_addr;
        //printf("ServerName:%s",host);
        printf("Begging!\n");
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                printf("socket创建出错!");
                exit(1);
        }
        printf("The socket is create sucessful!\n");
        serv_addr.sin_family=AF_INET;
        serv_addr.sin_port=htons(SERVPORT);
        serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        //bzero(&serv_addr.sin_zero,8);
        servlen = sizeof(serv_addr);
        if(connect(sockfd,(struct sockaddr *)&serv_addr,servlen) < 0){
                printf("connect出错");
                exit(1);
        }
       
        if((writelen = write(sockfd,writetemp,MAXDATASIZE)) < 0)
        {
                printf("The write is wrong!\n");
                exit(1);               
        }
        if((recvbytes=read(sockfd,buff,MAXDATASIZE)) < 0){
        printf("read wrong\n");
        exit(1);
        }
        //buff[recvbytes]='\0';
        printf("Receied:%s\n",buff);
        close(sockfd);
}
回复 支持 反对

使用道具 举报

发表于 2005-1-19 17:57:16 | 显示全部楼层

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "errno.h"
  4. #include "string.h"
  5. #include "sys/types.h"
  6. #include "netinet/in.h"
  7. #include "sys/socket.h"
  8. #include "sys/wait.h"

  9. #define SERVERPORT 8222
  10. #define BACKLOG 10

  11. int main(){
  12. printf("starting");
  13. int sockfd,clientfd,flag=0;
  14. struct sockaddr_in my_addr;
  15. struct sockaddr_in remote_addr;
  16. if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
  17. printf("socket创建出错\n");
  18. exit(1);
  19. }
  20. my_addr.sin_family=AF_INET;
  21. my_addr.sin_port=htons(SERVERPORT);
  22. my_addr.sin_addr.s_addr=INADDR_ANY;
  23. bzero(&(my_addr.sin_zero),8);
  24. if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
  25. printf("bind出错\n");
  26. exit(1);
  27. }
  28. if(listen(sockfd,BACKLOG)==-1){
  29. printf("listen出错\n");
  30. exit(1);
  31. }
  32. printf("begining");
  33. while(1){
  34.           flag=flag+1;
  35.           printf("Server:%d",&flag);
  36.          if((clientfd=accept(sockfd,(struct sockaddr *)&remote_addr,sizeof(struct                     
  37.           sockaddr_in)))==-1){
  38.                  printf("accept出错");
  39.                  close(clientfd);
  40.                   continue;
  41.                    }
  42.      printf("received a connetion from %s\n",inet_ntoa(remote_addr.sin_addr));
  43.            if(send(clientfd,"Hello,you are connected!\n",26,0)==-1) printf("send出错");      
  44.            close(clientfd);
  45.       
  46.      }
  47. //close(clientfd);
  48. //printf("ending");
  49. //}
  50. }

复制代码


好象在while 循环里处理得不是很好!所以你的SERVER 才没信息提示!
回复 支持 反对

使用道具 举报

发表于 2005-1-19 19:37:10 | 显示全部楼层
呵呵,这个程序把服务器端启动了没有命令停掉它,客房端用telnet进行登陆,输入几个字符在服务器端显示出来后客房端也不能动了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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