免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3568 | 回复: 8
打印 上一主题 下一主题

急 SOCKET编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-10 18:41 |只看该作者 |倒序浏览
//服务器程序
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/wait.h>
#include<netinet/in.h>

#define SERVPORT 128    //端口号
#define BACKLOG 10     //最大链接数

typedef struct sockaddr_in st;
typedef struct sockaddr sd;
int main()
{
        int sockfd,clientfd;
        st my_adder;
        st client_adder;
        int sin_size;
        if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)     //获取描诉符
                {perror("socket default!";
                exit(1);
                }
               
        printf("%d",sockfd);
        my_adder.sin_family = AF_INET;
        my_adder.sin_port = htons(SERVPORT);
        my_adder.sin_addr.s_addr = INADDR_ANY;
        bzero(&(my_adder.sin_zero),;
       
        if(bind(sockfd,(sd *) &my_adder,sizeof(sd)) == -1)   //绑定到端口
                {perror("bind error!";
                exit(1);
                }
        if(listen(sockfd,BACKLOG) == -1){          //侦听请求信息
                perror("linsten error";
                exit(1);
                }
        while(1){
                sin_size = sizeof(st);
                if((clientfd = accept(sockfd,(sd *)&client_adder,&sin_size)) == -1){   //接受与请求方建立链接
                        perror("accept error!";
                        continue;
                        }
                printf("accept a meg from:%s\n",inet_ntoa(client_adder.sin_addr));   
                if(!fork()){
                        if(send(clientfd,"connect\n",26,0) == -1)  //向请求方发送消息
                                perror("send error!";
                        close(clientfd);
                        exit(0);
                        }
                close(clientfd);
                }
}
//客户端程序
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<netdb.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<netinet/in.h>

typedef struct sockaddr_in st;
typedef struct sockaddr sd;

#define SERVPORT 128
#define MAXDATASIZE 100
int main(int argc,char *argv[])
{
        int sockfd,recvbytes;
        char buf[MAXDATASIZE];
        struct hostent *host;
        st servaddr;
        if(argc<2){
                fprintf(stdin,"please enter the sercer's hostname!\n";
                exit(1);
                }
        if((host = gethostbyname(argv[1])) == NULL){
                perror("gethostbyname error!";
                exit(1);
                }
        if (sockfd = socket(AF_INET,SOCK_STREAM,0) == -1){
                perror("socket creat error!";
                exit(1);
                }
//建立服务器端信息
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERVPORT);
        servaddr.sin_addr = *((struct in_addr *)host->h_addr);
        //inet_pton( AF_INET, "127.0.0.3", &servaddr.sin_addr );
        bzero(&(servaddr.sin_zero),;
        if (connect(sockfd,(sd *)&servaddr,sizeof(sd)) == -1){    //请求与服务器建立链接
                perror("connect error!";
                exit(1);
                }
        if((recvbytes = recv(sockfd,buf,MAXDATASIZE,0)) == -1){    //接收服务器端发送的信息
                perror("receve error!";
                exit(1);
                }
//显示收到的信息
        buf[recvbytes] = '\0';
        printf("receve:%s",buf);
        close(sockfd);
}
    在一个终端运行服务器程序后,在另外一个终端运行客户端程序8-2 127.0.0.1
       出现connect error!: Socket operation on non-socket错误,请大家帮忙解决下  谢谢
   那个笑脸不知道怎么去掉了

[ 本帖最后由 sydnash 于 2008-11-10 19:23 编辑 ]

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2008-11-10 18:52 |只看该作者

回复 #1 sydnash 的帖子

先格式化代码,这样看很累,也不方便别人帮你调试,论坛置顶有说如何贴代码

论坛徽章:
0
3 [报告]
发表于 2008-11-10 19:24 |只看该作者

回复 #2 timespace 的帖子

那个笑脸搞不定啊

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2008-11-10 20:03 |只看该作者
原帖由 sydnash 于 2008-11-10 19:24 发表
那个笑脸搞不定啊

参见置顶贴

论坛徽章:
0
5 [报告]
发表于 2008-11-11 10:47 |只看该作者

回复 #1 sydnash 的帖子

在这行"if (sockfd = socket(AF_INET,SOCK_STREAM,0) == -1){",由于运算符优先顺序,所以
sockfd 得到的 "socket(AF_INET,SOCK_STREAM,0) == -1" 的 bool 值,加上括号即可
"if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){"

论坛徽章:
0
6 [报告]
发表于 2008-11-11 10:48 |只看该作者
  1. int
复制代码

论坛徽章:
0
7 [报告]
发表于 2008-11-11 17:33 |只看该作者

回复 #5 流云CJ 的帖子

谢谢这位朋友
  照你说的做了  也对了   没想到就这样一个小问题
    看来一个良好的编程习惯确实很重要   还须改进阿

论坛徽章:
0
8 [报告]
发表于 2011-09-05 10:20 |只看该作者
非常感谢,我也是在5楼高人的提示下解决问题了

看错sock_fd  和socket 把
左括号 放置在了 socket前了,
应该是放置在sock_fd 前的  要看清楚了

论坛徽章:
0
9 [报告]
发表于 2011-09-05 10:24 |只看该作者
回复 8# mstearaway


    你这结贴的时间够长的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP