免费注册 查看新帖 |

Chinaunix

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

[C] c语言的网络编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-25 10:42 |只看该作者 |倒序浏览
各位老大:
    c语言中的网络编程怎么做,我是学java的,对c的网络编程不懂,请各位指教一下,最好给个小程序,比如可以通过socket(我不知道是不是这样说)互相收发一句话。

论坛徽章:
0
2 [报告]
发表于 2006-02-25 11:02 |只看该作者
去找unix网络编程看一下,上面有很好的例子

论坛徽章:
0
3 [报告]
发表于 2006-02-27 17:25 |只看该作者
/*
适用于Windows平台和Linux平台的UDP通讯函数
*/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#define SLEEP(t)
#ifdef _WIN32
#define SLEEP(t) Sleep(1000*t)
#include <Winsock2.h>
#include <Windows.h>
#pragma comment(lib,"Ws2_32.lib")
#else
#define SLEEP(t) sleep(t)
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <errno.h>
#endif
#include <sys/types.h>
#define MAX_MSG_SIZE 1024
int initSndSock(struct sockaddr_in * addr,char * SERVER_IP,int port);
int SndToSock(int sockfd,struct sockaddr_in * addr,char buffer[]);
int RcvFrmSock(int sockfd, char buffer[]);
int initRcvSockAtPort(int port);
int main(void)
{  
    int sockfd;
        struct sockaddr_in addr;
        char buffer[1024];
       
        sockfd = initSndSock(&addr, "192.168.1.100",9001);
        /* sockfd = initRcvSockAtPort(9001);
        printf("sock = %d\n", sockfd);
        while(1)
        {
           memset(buffer, 0, 1024);
           if(RcvFrmSock(sockfd, buffer)>=0)
           printf("Receive : %s", buffer);
          
}*/
        while(1)
        {
               
                memset(buffer,0,1024);
               
               
#ifdef _WIN32
                sprintf(buffer, "%s\n", "I am windows message\n");
               
                printf("WIN 32 Sending once ..........\n");
#else
                sprintf(buffer, "%s\n", "I am not Windows message\n");
               
                printf("Other  Sending once ..........\n");
#endif
               
                SndToSock(sockfd, &addr, buffer);
                SLEEP(1);
        }
        return 0;
}
int initSndSock(struct sockaddr_in * addr,char * SERVER_IP,int port)
{
        int sockfd;
        int a1,a2,a3,a4;
#ifdef WIN32
        WSADATA w;
        if(WSAStartup(0x0101, &w) != 0)
    {
                fprintf(stderr, "Could not open Windows connection.\n");
                exit(0);
    }
#endif
        sockfd=socket(AF_INET,SOCK_DGRAM,0);
#ifdef WIN32
    if(sockfd == INVALID_SOCKET)
        {
                fprintf(stderr, "Could not create socket.\n");
                WSACleanup();
                exit(0);
        }
    memset((void *)addr, '\0', sizeof(struct sockaddr_in));
#else
        if(sockfd<0)
        {
                fprintf(stderr,"Socket Error:%s\n",strerror(errno));
                return -1;
        }  
        bzero(addr,sizeof(struct sockaddr_in));   
#endif
           addr->sin_family=AF_INET;
        addr->sin_port=htons((u_short)port);
#ifdef  _WIN32
       
        sscanf(SERVER_IP,"%d.%d.%d.%d",&a1,&a2,&a3,&a4);
        addr->sin_addr.S_un.S_un_b.s_b1 = (unsigned char)a1;
        addr->sin_addr.S_un.S_un_b.s_b2 = (unsigned char)a2;
        addr->sin_addr.S_un.S_un_b.s_b3 = (unsigned char)a3;
        addr->sin_addr.S_un.S_un_b.s_b4 = (unsigned char)a4;
   
#else
        if(inet_aton(SERVER_IP,&(addr->sin_addr))<0)
        {
                fprintf(stderr,"Ip error:%s\n",strerror(errno));
                return -1;
        }
#endif
        return sockfd;
}

int SndToSock(int sockfd,struct sockaddr_in * addr,char buffer[])
{
        int len = sizeof(struct sockaddr_in);
        sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)addr,len);
        return 0;
}
int RcvFrmSock(int sockfd, char buffer[])
{
        int n,len,ll;
        struct sockaddr_in addr;
        len = sizeof(struct sockaddr_in);
    ll = len;  
    memset(buffer, '\0' , MAX_MSG_SIZE);
    n=recvfrom(sockfd, buffer, MAX_MSG_SIZE, 0, (struct sockaddr*)&addr, &ll);        
        if(n < 0) return -1;
        buffer[n] = '\0';  
        return n;
}
/*****************************************************************/

int initRcvSockAtPort(int port)
{
        int sockfd;
    struct sockaddr_in addr;
#ifdef _WIN32
        WSADATA w;
        if (WSAStartup(0x0101, &w) != 0)
        {
                fprintf(stderr, "Could not open Windows connection.\n");
                exit(0);
        }
#endif
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if(sockfd < 0)
        {
#ifdef _WIN32
                WSACleanup();
#endif
                fprintf(stderr, "Socket Error:%s\n", strerror(errno));
                return -1;
        }
       
        memset((void*)&addr, '\0', sizeof(struct sockaddr_in) );
        addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htons(INADDR_ANY);
       
        addr.sin_port = htons((u_short )port);
        if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0)
        {
                fprintf(stderr, "Bind Error  :%s\n", strerror(errno));
                return -1;
        }
        return sockfd;
}

论坛徽章:
0
4 [报告]
发表于 2006-02-27 18:05 |只看该作者
不知道这样的程序怎么读!

论坛徽章:
0
5 [报告]
发表于 2006-02-27 18:09 |只看该作者
socket原理都是一样得 java不一样有socket编程

论坛徽章:
0
6 [报告]
发表于 2006-02-27 18:28 |只看该作者
原帖由 history_sky 于 2006-2-25 10:42 发表
各位老大:
    c语言中的网络编程怎么做,我是学java的,对c的网络编程不懂,请各位指教一下,最好给个小程序,比如可以通过socket(我不知道是不是这样说)互相收发一句话。

这里刚好有两个符合要求的例子:
http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html
其实对于网络编程java和c类似,只不过java封装了Socket类,可能更接近C++

论坛徽章:
0
7 [报告]
发表于 2006-02-28 15:29 |只看该作者
您推荐的网页真不错。多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP