| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 624 人关注过本帖
标题:使用套接字的基于 TCP 协议网络通信的程序为什么老运行不出来呢?
只看楼主 加入收藏
qwerty23456
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-5-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
使用套接字的基于 TCP 协议网络通信的程序为什么老运行不出来呢?
服务器端
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>

int main(int argc ,char * argv[] )//整数类型主函数(整数类型统计参数个数,字符类型*数组指针至字符[])
{
    //判断是否输入了端口号
    if(argc!=2)
    {
        printf("Usage: % s PortNumber\n",argv[0]);
        exit(-1) ;
    }
    //把端口号化为整数
    short  port;
    if((port = atoi (argv[1]))==0)
    {
        printf("端口号有误!");
        exit(-1);
    }
    WSADATA wsa;
    //初始化套接字DLL
    if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
    {
        printf("套接字初始化失败!");
        exit(-1);
    }
    //创建套接字
    SOCKET serverSocket;
    if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
    {
        printf("创建套接字失败!");
        exit(-1);
    }
//构造完整的地址数据结构
    struct sockaddr_in serverAddress;
    memset(&serverAddress,0,sizeof(sockaddr_in));//将serverAddress变量清零
   serverAddress.sin_family  = AF_INET;//将协议族设置为TCP/IP协议
    serverAddress.sin_addr .S_un.S_addr  = htonl (INADDR_ANY);
    serverAddress.sin_port  = htons (port);//端口设置
    //绑定
    if(bind(serverSocket,(sockaddr * )&serverAddress,sizeof(serverAddress))==SOCKET_ERROR)
    {
        printf("套接字绑定到端口失败!端口: %d\n",port);
        exit(-1);
    }
    //进入侦听状态
    if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR)
    {
        printf("侦听失败!");
        exit(-1);
    }
    printf("Server %d is listening......\n",port);
    SOCKET clientSocket;     //用来和客户端通信的套接字
    struct sockaddr_in clientAddress;       //用来和客户端通信的套接字地址
    memset(&clientAddress,0,sizeof (clientAddress));
    int addrlen = sizeof(clientAddress);
    //接受连接
    if((clientSocket=accept(serverSocket,(sockaddr* )&clientAddress,&addrlen))== INVALID_SOCKET)
    {
        printf("接受客户端连接失败!");
        exit(-1);
    }
    printf("Accept connection from % s\n",inet_ntoa(clientAddress.sin_addr));
    char buf[4096];
    while(1)
    {
        //接收数据
        int bytes;
        if((bytes=recv(clientSocket,buf,sizeof(buf),0))==SOCKET_ERROR)
        {
            printf("接收数据失败!\n");
            exit(-1);
        }
        buf[bytes]='\0';
        printf("Message from %s: %s\n",inet_ntoa(clientAddress.sin_addr),buf);
        if(send(clientSocket,buf,bytes,0)== SOCKET_ERROR)
        {
            printf("发送数据失败!");
            exit(-1);
        }
    }
    //清理套接字占用资源
    WSACleanup();
    return 0;
}
客户机端
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>

int main(int argc,char * argv[])
{
    //判断是否输入了IP地址和端口号
    if(argc!=3)
    {
        printf("Usage: % s IPAddress PortNumber\n",argv[0]);
        exit(-1);
    }
    //把字符串的IP地址转化为u_long
    unsigned long ip;
    if((ip = inet_addr(argv[1]))== INADDR_NONE)
    {
        printf("不合适的IP地址:%s",argv[1]);
        exit(-1);
    }
    //把端口号化为整数
    short port;
    if((port = atoi(argv[2]))==0)
    {
        printf("端口号有误!");
        exit(-1);
    }
    printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port);
    WSADATA wsa;
    //初始化套接字DLL
    if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
    {
        printf("套接字初始化失败!");
        exit(-1);
    }
    //创建套接字
    SOCKET socket;
    if((socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
    {
        printf("创建套接字失败!");
        exit(-1);
    }
    struct sockaddr_in serverAddress;
    memset(&serverAddress,0,sizeof(sockaddr_in));
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_addr.S_un.S_addr = ip;
    serverAddress.sin_port = htons(port);
    //建立和服务器的连接
    if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))== SOCKET_ERROR)
    {
        printf("建立连接失!");
        exit(-1);
    }
    char buf[4096];
    while(1)
    {
        printf(">");
        //从控制台读取一行数据
        gets(buf);
        //发送给服务器
        if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR)
        {
            printf("发送数据失败!");
            exit(-1);
        }
        int bytes;
        if((bytes = recv(socket,buf,sizeof(buf),0))== SOCKET_ERROR)
        {
            printf("接收数据失败!\n");
            exit(-1);
        }
        buf[bytes]='\0';
        //调用inet_ntoa函数将长整型地址转换为点分十进制字符串
        printf("Message from %s: %s\n",inet_ntoa(serverAddress.sin_addr),buf);
    }
    //清理套接字占用资源
    WSACleanup();
    return 0;
    }
搜索更多相关主题的帖子: include 服务器 通信 网络 
2014-05-17 16:10
邵帅
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:20
帖 子:174
专家分:505
注 册:2012-8-27
收藏
得分:20 
int main(int argc ,char * argv[] )
输入参数了吗?

Figure out what you like. Try to become the best in the world of it.
2014-05-17 16:24
qwerty23456
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-5-15
收藏
得分:0 
回复 2 楼 邵帅
没有,在哪里输入
2014-05-17 16:40
tutujun
Rank: 1
等 级:新手上路
威 望:2
帖 子:6
专家分:0
注 册:2014-5-19
收藏
得分:0 
回复 3 楼 qwerty23456
设置为void类型就可以了,看你都没有用到定义的int函数参数
2014-06-16 08:26
快速回复:使用套接字的基于 TCP 协议网络通信的程序为什么老运行不出来呢?
数据加载中...
 
   



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

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