| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1610 人关注过本帖, 1 人收藏
标题:C语言SOCKET编程问题,请老鸟指点
只看楼主 加入收藏
万士心平
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-1-30
结帖率:55.56%
收藏(1)
 问题点数:0 回复次数:6 
C语言SOCKET编程问题,请老鸟指点
交谈中请勿轻信汇款、中奖信息,勿轻易拨打陌生电话。

No.万 Troyan<visualbsc@  20:12:31
/**TCP服务端 */
#include<stdio.h>
#include<stdlib.h>
#include<Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
int main(void){
    SOCKET sListen,sAcpt;  //记录监听、连接套接字
    int sendLen;    //记录返回的发送的字节数
    int cliLen;  //记录客户端协议地址的长度,用来作为生成连接套接字accept的参数
    sockaddr_in serAddr,cliAddr; //服务端,客户端的协议地址
    WSAData wsaData; //定义版本结构体
    char buf[]="hello!i'm a server!"; //服务端需要发送的数据
    int port=5000;  //服务器的端口
    printf("---waiting-------\n");
    if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
        {
            printf("WSAStartup() failed,code: %d\n",WSAGetLastError());
            return 1;
   
        }
    if(MAKEWORD(2,2)!=wsaData.wVersion)  //套接字版本不一样
        {
            WSACleanup(); //释放
            return 1;
   
        }
    sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建监听套接字
    serAddr.sin_family=AF_INET; //定义协议类型为IP
    serAddr.sin_port=htons(port); //将主机顺序的端口字节转换为网络顺序的字节
    serAddr.sin_addr.s_addr=htonl(INADDR_ANY);//由服务器分配地址
    if(bind(sListen,(SOCKADDR *)&serAddr,sizeof(serAddr))==SOCKET_ERROR)
        {
            printf("bind() failed code:%d",WSAGetLastError());
            return 1;
        }
    if(listen(sListen,5)==SOCKET_ERROR)
        {   
            printf("listen() failed code:%d\n",WSAGetLastError());
            return 1;
        
        }
    cliLen=sizeof(cliAddr);
    while(1)
        {
            sAcpt=accept(sListen,(SOCKADDR *)&cliAddr,&cliLen);  //创建连接套接字
            if(sAcpt==INVALID_SOCKET)
                {
                    printf("accept() failed code: %d",WSAGetLastError());
                    return 1;
            
                }
            //输出客户端的网络地址
            printf("client port:[%d]\t ip:[%s]",ntohs(cliAddr.sin_port),inet_ntoa/*点分十进制的IP转换成网络字节顺序的地址*/(cliAddr.sin_addr));
            sendLen=send(sAcpt,buf,sizeof(buf),0); //发送信息并且返回一个值
            if(sendLen==SOCKET_ERROR)
                {
                    printf("send() failed code:%d\n",WSAGetLastError());
                    break;

                }   
            else if(sendLen==0)
                    break;
            else
                {
                    printf("send massage length is %d\n",sendLen);
                    printf("------------------\n");
            
                }
            closesocket(sAcpt);
   
   
   
        }
        closesocket(sListen);  //关闭连接
        WSACleanup();        //释放资源
    return 0;
    }

-------------------------------------------------------------
/*TCP 客户端*/
#include<Winsock2.h>
#include<stdio.h>
#pragma    comment(lib, "ws2_32.lib")
#define BUFFSIZE 1024
#define DEFAULT_PORT 5000
int main(){
    SOCKET s;  //客户端的套接字
    WSAData wsaData; //版本结构体
    int port=DEFAULT_PORT; //客户端端口号
    char buf[BUFFSIZE];  //接受服务器端的缓存区
    sockaddr_in serAddr; //客户端服务端的网络地址
    int recLen;//接收到服务端发送过来的长度
    char saddr[50];
    gets(saddr);
    if(WSAStartup(0X0202,&wsaData)!=0){
            printf("WSAStartup() failed code:%d",WSAGetLastError());
            return 1;
        }
    if(0x0202!=wsaData.wVersion){
            WSACleanup();
            return 1;
        }
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //建立套接字
    if(s==INVALID_SOCKET){
        printf("socket() failed code: %d",WSAGetLastError());
        return 1;
   
        }

    memset(buf,0,sizeof(buf)); //接收信息缓冲区初始化为全零
    serAddr.sin_family=AF_INET;
    serAddr.sin_port=htons(port);
    serAddr.sin_addr.s_addr=inet_addr(saddr);
    if(connect(s,(SOCKADDR *)&serAddr,sizeof(SOCKADDR))==INVALID_SOCKET){
            printf("connnect() failed code: %d",WSAGetLastError());
            return 1;
        }
    else
        {
            recLen=recv(s,buf,sizeof(buf),0);
            if(recLen==SOCKET_ERROR){
                    printf("recv() error code: %d\n",WSAGetLastError());
                    return 1;
                }
            printf("recieve data from server: %s\n",buf);
        
        }
    closesocket(s);
    WSACleanup();

}

想要实现 一台电脑上测试,用本机内部本地地址 192.168的C类地址 在客户端输入该地址 后 用connect函数申请连接上面的服务端程序
服务端程序listen到后
用accept返回一个连接套接字,并且显示客户端IP bind的端口号码
然后send buf字符串里面的内容发送过去给客户端 显示出来
但是效果不是想要的,希望老鸟指点下,源码里面出了什么问题!
谢谢了!
搜索更多相关主题的帖子: 服务端 结构体 C语言 
2010-07-13 20:20
hao0716
Rank: 4
等 级:业余侠客
威 望:1
帖 子:354
专家分:224
注 册:2006-4-11
收藏
得分:0 
扫了一下没看出什么问题,具体是哪一步有问题

2010-07-13 20:40
ZQDragon
Rank: 2
等 级:论坛游民
帖 子:30
专家分:39
注 册:2010-6-8
收藏
得分:0 
一个月后再告诉你   呵呵
   路过。。。。。。。。。。。
2010-07-13 22:31
qq1
Rank: 2
等 级:论坛游民
帖 子:92
专家分:22
注 册:2010-3-26
收藏
得分:0 
不是有人和我说C语言没有winsock吗?
还说不能网络编程
搞的我都开始迷糊了
2010-07-14 00:03
限量版猪头
Rank: 2
等 级:论坛游民
威 望:1
帖 子:165
专家分:30
注 册:2006-2-5
收藏
得分:0 
楼主能具体说下在哪出错吗?

大概看了一眼,逻辑上没大错误,但是winsock用的不是很规范,既然用了wsa开头的,那最好下面都用wsa开头的(具体我也忘了),

顺便回4楼的, windows上确实是一定要用winsock,只是上层可以用标准的socket语法,最后和winsock相关的DLL链接。

最后楼主看看你的socket创出来时阻塞还是非阻塞,如果默认是非阻塞的,那肯定有问题的,要用select(),标准socket创出来应该是非阻塞的,需要

fcntl的O_NONBLOCK属性,当然我这是标准的Socket,winsock也许有不同



2010-07-21 17:17
快速回复:C语言SOCKET编程问题,请老鸟指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018246 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved