日期:2014-05-16  浏览次数:20602 次

unix中简单的C/S文件通信(二)
    我把"unix中简单的C/S文件通信"中的代码改进了下,服务器端给客户端发完文件,即客户端接收完文件后再给服务器端发文件,但程序似乎卡在了客户端发送文件那儿,求各位高手给看看,能给一些改进的提示也好,谢谢各位高手了,改进后原代码如下:
    newserver:
 #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>



#define TRUE 1 /////////////
#define DataNum 126 //////////// 有用的126字节
#define BUFSIZE 128 ///////////// 每次发送128字节
#define PERM 0644  /* 创建文件的默认属性*/
/*发的时候是128,*/
main ()
{
    int sock,length,clilen;
    struct sockaddr_in server,client;
    int msgsock;
    char newbuf[BUFSIZE];
    int newoutfile;
    ssize_t newnread;
    int j=0;
    int newrealn;
    char newcharnum;

    /******************************建立Socket连接*********************************/
    sock=socket(AF_INET,SOCK_STREAM,0); //申请socket资源   
    if (sock<0)
    {
        perror("opening stream socket");
        exit(1);
    }

    server.sin_family=AF_INET;
    server.sin_addr.s_addr=INADDR_ANY; /*必然的,这里指的是Internet协议*/
    server.sin_port=0;/*这里,是让系统自动分配一个端口号,在1024到5000之间65535个端口 ,端口设为0,系统自动分配 */  
    if (bind(sock,(struct sockaddr *)&server,sizeof server)<0) /*将IP地址和端口号绑到sock上 */
    {
        perror("binding stream socket");
        exit(1);
    }

    length=sizeof server;
    if (getsockname(sock,(struct sockaddr *)&server,&length)<0) /*获得指定socket的本地地址,成功返回0,错误返回-1*/
    {
        perror("getting socket name");
        exit(1);
    }
    printf("Socket port # %d\n",ntohs(server.sin_port)); /* 打印出系统分的端口号,给client用*/

    listen(sock,5); /*5个连接请求排队等待,一般5个 Pause Here 等待client连接*/

    /****************现在是等待客户来连接,如果来客户了,那就建好了socket,就可以当文件使用**********/
    clilen=sizeof client;   
    msgsock=accept(sock,(struct sockaddr *)&client,(int *) &clilen);/*创建一个新的与sock相同的socket并返回其值*/
    if (msgsock==-1) /*非并发处理,反复型*/
       perror("accept");
    else  
    { /**********这里开始进行文件处理,一直到最后************/
       int infile;
       ssize_t nread;
       char buf[BUFSIZE];  &