从客户端读取数据包在收到1或2后停止

时间:2015-06-14 09:41:31

标签: c linux sockets server

我正在用C编写一个服务器程序,它将从客户端读取命令。命令采用5字节数据包的形式,客户端将连续发送一堆数据包。我必须阅读每个命令的代码是:

while(1)
{
    char buffer[1024];
    int alreadyread = 0;
    int socket = dequeue();

    while(alreadyread != 5)
    {
        do
        {
            nowread = read(socket,buffer+alreadyread,5-alreadyread);
            alreadyread += nowread;
        }
        while((nowread > 0) && (5-alreadyread > 0));

        if(nowread == -1 || nowread == 0)
        {
            printf("Error reading from client socket\n");
            exit(1);
        }
              //DO COMMAND

但这似乎不起作用:如果客户端发送10个数据包,我会读取1或2然后得到段错误。有谁知道为什么?

1 个答案:

答案 0 :(得分:1)

alreadyread似乎无关紧要,因为nowread将为5,或者nowread将在do-while之后小于0,如果close小于0则退出

您的命令定义不佳,我认为我们需要更多相关信息。

看起来你在每个命令后都得到一个新的套接字。如果它只是一个客户端发送命令,你应该保留套接字,直到你得到你想要的所有命令。完成后,您还应该function render() { gapi.signin.render('loginWithGoogle', { 'callback': 'onSignIn', 'clientid': 'the client id', 'cookiepolicy': 'single_host_origin', 'requestvisibleactions': 'http://schema.org/AddAction', 'scope': 'https://www.googleapis.com/auth/plus.login' }); isGPInitialzed = true; } //Google function onSignIn(authResult) { if (!isGPInitialzed) { if (authResult['status']['signed_in']) { //get some user info gapi.client.load('oauth2', 'v2', function () { gapi.client.oauth2.userinfo.get().execute(function (response) { console.log(response.email); $.ajax({ url: '/Account/GLogin', type: 'POST', data: { email: response.email, name: response.name, profilePicture: response.picture }, dataType: 'json', success: function (isUserLoggedIn) { if (isUserLoggedIn) { window.location.reload(); } } }); }); }); } } else { isGPInitialzed = false; } }; 套接字,这样您就不会用完文件描述符。

段错误可能是由您尚未显示的程序的另一个区域引起的。