红联Linux门户
Linux帮助

刚才新鲜出炉的网络套接字基础编程

发布时间:2009-05-04 21:58:31来源:红联作者:414716676
为各位新手打开网络编程的基础大门,希望能给各位新手带来帮助,高手还是飘过!
封装系统提供的read函数和write函数源代码:(文件保存为iolib.h)
#include
#include
#include
ssize_t my_read(int fd,void *buf,size_t length)
{
ssize_t done = length;
while(done>0)
{
done=read(fd,buf,length);
if(done != length)
if(errno==EINTR)
done=length;
else
{
perror("fail to read!\n");
return -1;
}
else
break;
}
return done;
}

ssize_t my_write(int fd,void *buf,size_t length)
{
ssize_t done = length;
while(done>0)
{
done=write(fd,buf,length);
if(done != length)
if(errno==EINTR)
done=length;
else
{
perror("fail to write!\n");
return -1;
}
else
break;
}
return done;
}
文章评论

共有 8 条评论

  1. 翻转乾坤 于 2014-05-30 12:41:57发表:

    我不确定自己能用多少时间把你忘了,也不敢保证我就能真的把你忘了,我只能像现在这样,不吵不闹,不悲不喜,安安静静的与你,再无交集

  2. sleepydonkey 于 2014-05-22 11:22:14发表:

    为什么我自己运行就是要出错呢,学套接字都要学崩溃了

  3. 414716676 于 2009-05-04 23:12:09发表:

    以上是操作本地文件的网络编程基础程序

  4. 414716676 于 2009-05-04 22:54:56发表:

    嘿嘿,最简单的服务器客服端程序,只能转换简单的字符串大小写而已

  5. Mysdwn 于 2009-05-04 22:35:11发表:

    高深,楼主牛

  6. 414716676 于 2009-05-04 22:01:22发表:

    用GCC编译器编译:
    gcc /aming/a_a.c /aming/iolib.h -o /aming/a_a
    gcc /aming/b_a.c /aming/iolib.h -o /aming/b_a

    运行方法:
    打开两个终端,一个运行第一个程序,第二个运行第二个程序

  7. 414716676 于 2009-05-04 21:59:33发表:

    客服端源代码:
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include "iolib.h"

    #define MAX_LINE 100
    int main(int argc,char *argv[])
    {
    struct sockaddr_in sin;
    char buf[MAX_LINE];
    int sfd;
    int port=8000;
    char *str="Test Sting!";
    int n;
    if(argc>1)
    {
    str=argv[1];
    }
    bzero(&sin,sizeof(sin));
    sin.sin_family=AF_INET;
    inet_pton(AF_INET,"127.0.0.1",&sin.sin_addr);
    sin.sin_port=htons(port);
    if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
    perror("fail to creat socket!\n");
    exit(1);
    }
    if(connect(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
    {
    perror("fail to connect!\n");
    exit(1);
    }
    n=my_write(sfd,str,strlen(str)+1);
    if(n==-1)
    exit(1);
    n=my_read(sfd,buf,MAX_LINE);
    if(n==-1)
    exit(1);
    printf("recive from server : %s \n",buf);
    if(close(sfd)==-1)
    {
    perror("fail to close!\n");
    exit(1);
    }
    return 0;
    }

  8. 414716676 于 2009-05-04 21:59:04发表:

    [i=s] 本帖最后由 414716676 于 2009-5-4 22:49 编辑 [/i]

    服务器端源代码:
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include "iolib.h"

    #define MAX_LINE 100

    void my_fun(char *p)
    {
    if(p==NULL)
    return;

    for(; *p !='\0'; p++)
    if(*p >= 'A' && *p <= 'Z')
    *p=*p-'A'+'a';
    }
    int main(void)
    {
    struct sockaddr_in sin;
    struct sockaddr_in cin;
    int l_fd;
    int c_fd;
    socklen_t len;
    char buf[MAX_LINE];
    char addr_p[INET_ADDRSTRLEN];
    int port=8000;
    int n;

    bzero(&sin,sizeof(sin));
    sin.sin_family=AF_INET;
    sin.sin_addr.s_addr=INADDR_ANY;
    sin.sin_port=htons(port);

    if((l_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
    perror("fail to creat socket!\n");
    exit(1);
    }
    if(bind(l_fd,(struct sockaddr *) &sin,sizeof(sin))==-1)
    {
    perror("fail to bind!\n");
    exit(1);
    }
    if(listen(l_fd,10)==-1)
    {
    perror("fail to listen!\n");
    exit(1);
    }
    printf("waiting..........\n");

    while(1)
    {
    if((c_fd=accept(l_fd,(struct sockaddr *)&cin,&len))==-1)
    {
    perror("fail to accept!\n");
    exit(1);
    }
    n=my_read(c_fd,buf,MAX_LINE);
    if(n==-1)
    exit(1);
    else if(n==0)
    {
    perror("the connect has been closed!\n");
    close(c_fd);
    continue;
    }
    inet_ntop(AF_INET,&cin.sin_addr,addr_p,sizeof(addr_p));
    printf("client IP IS %s ,port is %d\n",addr_p,ntohs(cin.sin_port));
    printf("content is : %s \n",buf);
    my_fun(buf);
    n=my_write(c_fd,buf,n);
    if(n==-1)
    {
    exit(1);
    }
    if(close(c_fd)==-1)
    {
    perror("fail to close!\n");
    exit(1);
    }
    }
    return 0;
    }