首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

套接字客户服务器的传输有关问题

2012-12-31 
套接字客户服务器的传输问题客户程序代码· includesys/types.h#includesys/socket.h#includestdio.h

套接字客户服务器的传输问题
客户程序代码·

 
include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<sys/un.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
        int sockfd;
        int len;
        struct sockaddr_un address;
        int result;
        char ch='A';

        sockfd=socket(AF_UNIX,SOCK_STREAM,0);
//给套接字命名
        address.sun_family=AF_UNIX;
        strcpy(address.sun_path,"server_socket");
        len=sizeof(address);

//将套接字连接到服务器
        result=connect(sockfd,(struct sockaddr*)&address,len);

        if(result==-1)
        {
                perror("oops:client1");
                exit(EXIT_FAILURE);
        }
//通过套接字进行读写
        write(sockfd,&ch,1);
        read(sockfd,&ch,1);
        printf("char form server =%c\n",ch);
        close(sockfd);
        exit(EXIT_SUCCESS);

}



服务器程序代码:
#includeisys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<sys/un.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
        int server_sockfd, client_sockfd;
        int server_len,client_len;
        struct sockaddr_un server_address;
        struct sockaddr_un client_address;

//删除以前的套接字,为服务器创建一个未命名的套接字
        unlink("server_socket");
        server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);

//命名套接字
        server_address.sun_family=AF_UNIX;
        strcpy(server_address.sun_path,"server_socket");
        server_len=sizeof(server_address);
        bind(server_sockfd,(struct address*)&server_address,server_len);


        listen(server_sockfd,5);
        while(1)
        {
                char ch;
                printf("server waiting\n");
//接受一个请求
                client_len=sizeof(client_address);
                client_sockfd=accept(server_sockfd,(structsockaddr*)&client_address,&client_len);


                read(client_sockfd,&ch,1);
                ch++;
                write(client_sockfd,&ch,1);
                close(client_sockfd);
        }
        exit(EXIT_SUCCESS);
}
                                                            

 




客服程序 通过  套接字 写入一个字符A  服务器程序返回字符B

我想问的是 关于客服程序中的 write()和read()
客服程序向通过套接字写入字符后又立刻读取,怎么确定读取的一定是 服务器已经处理过的呢··
这之间有什么机制么,还是阻塞了直到服务器讲处理后的字符返回。

本人新手  希望可以解释的清楚点
[解决办法]
你客户端write后,可以将ch赋值为别的值或者清空。不然的话你read失败ch还是A。write、read默认情况下是阻塞的。

[解决办法]
客户端写完一个字符后执行read(sockfd,&ch,1);这一句是会阻塞,直到读到从服务器端的返回或出错为止,通过判断函数的返回值确定是成功读取还是出错了,修改如下:
if(read(sockfd,&ch,1) < 0)
{
    printf("error!\n");
    exit(0);

else
{
    printf("char form server =%c\n",ch);
}

学习编程还是要看看书的,学习网络推荐看看<UNIX网络编程>,最好也看看<UNIX环境高级编程>,这都是编程必看书,大多问题看书都能解决。

热点排行