我正在用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然后得到段错误。有谁知道为什么?
答案 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;
}
};
套接字,这样您就不会用完文件描述符。
段错误可能是由您尚未显示的程序的另一个区域引起的。