c tcp协议服务器,c使用TCP/IP协议的服务器客户端应用程序

嗨,我正在开发两个不同的操作 系统之间的服务器客户端。我在Windows上的Ubuntu 14.04 &客户端上执行服务器。c使用TCP/IP协议的服务器客户端应用程序

/* Simple Server code on TCP/IP protocol */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define length 512

void error(const char *msg)

{

perror(msg);

exit(1);

}

int main(int argc, char *argv[])

{

int sockfd, newsockfd, portno; //Declare variable for Socket and port

socklen_t clilen; //Client address and port no

char buffer[length]; //Buffer for message

struct sockaddr_in serv_addr, cli_addr; //Srtructure for server and Client address

int n; //Check whether listen,accept,read,write process done

FILE *fileptr; //File pointer

int datasize;

/* Check Portno. provided or not */

if (argc < 2) {

fprintf(stderr,"ERROR, no port provided\n");

exit(1);

}

/*Create socket*/

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0)

error("ERROR opening socket");

bzero((char *) &serv_addr, sizeof(serv_addr)); //Clear memory for Server address

portno = atoi(argv[1]); //Convert portno in to Integer from ASCII

/*Server address and all other details */

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = INADDR_ANY;

serv_addr.sin_port = htons(portno);

/*Bind socket*/

if (bind(sockfd, (struct sockaddr *) &serv_addr,

sizeof(serv_addr)) < 0)

error("ERROR on binding");

/*Listening to socket and waiting for users(max.5) */

listen(sockfd,5);

clilen = sizeof(cli_addr); //Size of Client address

/*Accept users*/

newsockfd= accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);

if (newsockfd< 0)

error("ERROR on accept");

/*File operations */

char* fs_name = "/home/ankur/Desktop/RTSIM_Dump.csv";

fileptr=fopen(fs_name,"r"); //Open file

/*Write and Read operation to socket*/

bzero(buffer,length);

while((datasize = fread(buffer,sizeof(char),length,fileptr))>0)

{

if(send(newsockfd,buffer,datasize,0)<0)

{

fprintf(stderr, "ERROR: Failed to send file :%s (errno = %d)\n",fs_name,errno);

break;

}

bzero(buffer,length);

}

fclose(fileptr); //Close file

close(newsockfd); //Close to accept client

close(sockfd); //close socket

return 0;

}

//Client code:

------------------------------------------------------------------------------#define WIN32_LEAN_AND_MEAN

#define _WIN32_WINNT 0x0501

#include

#include

#include

#include

#include

#include

#include

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib

#pragma comment (lib, "Ws2_32.lib")

#pragma comment (lib, "Mswsock.lib")

#pragma comment (lib, "AdvApi32.lib")

#define DEFAULT_BUFLEN 512

#define DEFAULT_PORT "2222"

int __cdecl main(int argc, char **argv)

{

WSADATA wsaData;

SOCKET ConnectSocket = INVALID_SOCKET;

struct addrinfo *result = NULL,

*ptr = NULL,

hints;

char sendbuf[DEFAULT_BUFLEN];

char recvbuf[DEFAULT_BUFLEN];

int iResult;

int recvbuflen;

FILE *fileptr;

// Validate the parameters

if (argc != 2) {

printf("usage: %s server-name\n", argv[0]);

return 1;

}

// Initialize Winsock

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

if (iResult != 0) {

printf("WSAStartup failed with error: %d\n", iResult);

return 1;

}

ZeroMemory(&hints, sizeof(hints));

hints.ai_family = AF_UNSPEC;

hints.ai_socktype = SOCK_STREAM;

hints.ai_protocol = IPPROTO_TCP;

// Resolve the server address and port

iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);

if (iResult != 0) {

printf("getaddrinfo failed with error: %d\n", iResult);

WSACleanup();

return 1;

}

// Attempt to connect to an address until one succeeds

for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

// Create a SOCKET for connecting to server

ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,

ptr->ai_protocol);

if (ConnectSocket == INVALID_SOCKET) {

printf("socket failed with error: %ld\n", WSAGetLastError());

WSACleanup();

return 1;

}

// Connect to server.

iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);

if (iResult == SOCKET_ERROR) {

closesocket(ConnectSocket);

ConnectSocket = INVALID_SOCKET;

continue;

}

break;

}

freeaddrinfo(result);

if (ConnectSocket == INVALID_SOCKET) {

printf("Unable to connect to server!\n");

WSACleanup();

return 1;

}

//Receive file from Server and save it.

fileptr = fopen("/Desktop/RTSIM_Dump.csv","w");

if (fileptr == NULL)

{

printf("ERROR:Create/Open file");

exit(1);

}

int write_sz;

memset(recvbuf,0,DEFAULT_BUFLEN);

while((recvbuflen = recv(ConnectSocket,recvbuf,DEFAULT_BUFLEN,0))>0)

{

write_sz = fwrite(recvbuf,sizeof(char),recvbuflen,fileptr);

if(write_sz < recvbuflen)

{

printf("File write failed.\n");

}

memset(recvbuf,0,DEFAULT_BUFLEN);

if(recvbuflen == 0 || recvbuflen != 512)

{

break;

}

}

if(recvbuflen < 0)

{

printf("recv() timed out.\n");

}

// cleanup

fclose(fileptr);

closesocket(ConnectSocket);

WSACleanup();

return 0;

}

--------------------------------------- ---------------------------------------我在服务器上获得errno 104(Ubuntu)&在 Windows上创建/打开文件错误。

在此先感谢!

我在Ubuntu上检查了服务器客户端,它工作完美,但当我 尝试与Windows客户端。它在执行期间给我错误。

+0

你的windows计算机上真的有'/ Desktop'目录吗? –

+0

我犯了愚蠢的错误。但在服务器端它仍然给errno 104 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值