我已經嘗試在後臺運行我的服務器,它顯示在ps下,我可以看到我的服務器正在運行,但是當我嘗試運行客戶端時,通過正確的服務器應該寫到客戶端說「成功連接到服務器「但沒有輸出。爲什麼我的服務器沒有發送任何東西給我的客戶
我的服務器代碼
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
using namespace std;
int main()
{
int serverFd;
int clientFd;
int serverLen;
int clientLen;
string message;
string serverSockAddrPtr;
struct sockaddr* serverSockAddressPnt;
struct sockaddr* clientSockAddressPnt;
struct sockaddr_un serverAddress;
struct sockaddr_un clientAddress;
cout << "" << endl;
cout << "Running server program 'css' ...... " << endl;
cout << "" << endl;
// SOCKET CREATION PART - SERVER
serverFd = socket (AF_LOCAL, SOCK_STREAM, 0);
/* Set domain type */
serverAddress.sun_family = AF_LOCAL;
/* Set name */
strcpy (serverAddress.sun_path, "CServer");
/* GET SIZE OF Server Addres */
serverLen = sizeof serverAddress;
/* GET SIZE OF Client Addres */
clientLen = sizeof clientAddress;
/* Get Server Sock Address Pointer*/
serverSockAddressPnt = (struct sockaddr *) &serverAddress;
/* Get Client Sock Address Pointer*/
clientSockAddressPnt = (struct sockaddr *) &clientAddress;
/* Create file */
bind (serverFd, serverSockAddressPnt , serverLen);
/* listen for connection */
listen (serverFd,5);
cout << "" << endl;
// SOCKET CREATION END - SERVER
while(1)
{
//accept client connection
clientFd = accept(serverFd, clientSockAddressPnt, (socklen_t*)&clientLen);
if(clientFd >= 0)
{
if(fork() == 0)
{
message="Successfully connected to the server";
write(clientFd,message.c_str(),strlen(message.c_str())+1);
close(clientFd);
exit(0);
}
else
close(clientFd);
}
}
return 0;
}
我的客戶端代碼
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#define DEFAULT_PROTOCOL 0
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
using namespace std;
/* READ LINE FUNCTION*/
int readLine (int fd,char* str)
{
int n;
do
{
n = read(fd,str,1);
}while(n>0&& *str++ != 0);
return(n>0);
}
/* READ LINE FUNCTION END*/
/* READ SERVER FUNCTION*/
void readServer (int fd)
{
char str[500];
while (readLine(fd,str))
{
printf("%s",str);
}
}
/* READ SERVER FUNCTION END*/
int main()
{
int clientFd,serverLen,result;
struct sockaddr_un serverAddress;
struct sockaddr* serverSockAddressPnt;
/* Get Server Sock Address Pointer*/
serverSockAddressPnt = (struct sockaddr *) &serverAddress;
/* GET SIZE OF Server Addres */
serverLen = sizeof serverAddress;
clientFd = socket (AF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL);
serverAddress.sun_family = AF_LOCAL;
strcpy (serverAddress.sun_path,"CServer");
do
{
// a loop to keep trying till connected.
result=connect(clientFd,serverSockAddressPnt,serverLen);
if(result==-1)
{
//wait for 1 second to retry
sleep(1);
}
}while(result==-1);
readServer (clientFd);
close (clientFd);
exit(0);
return 0;
}
將gdb附加到服務器程序,看看發生了什麼。 – jman 2012-08-02 05:01:28
除了在GDB中通過服務器或客戶端代碼進行調試外,還可以添加更多輸出。例如,如果客戶端連接成功,則可以將其打印到客戶端和服務器中的控制檯,但更重要的是,在出現_fails_和錯誤代碼時打印輸出。 – 2012-08-02 05:41:59
這不是C,而是C和C++的混合。不要這樣做,這是不值得的,決定要使用哪種語言並堅持下去。 – 2012-08-02 07:08:13