使用TCP/IP协议的c语言服务器客户端应用程序
您好,我正在两个不同的操作系统之间开发服务器客户端 系统。我在Ubuntu 14.04上执行服务器,在Windows上执行客户端使用TCP/IP协议的c语言服务器客户端应用程序,c,windows,ubuntu,server,client,C,Windows,Ubuntu,Server,Client,您好,我正在两个不同的操作系统之间开发服务器客户端 系统。我在Ubuntu 14.04上执行服务器,在Windows上执行客户端 /*TCP/IP协议上的简单服务器代码*/ #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义长度512 无效错误(常量字符*消息) { 佩罗尔(味精); 出口(1); } int main(int argc,char*argv[]) { int sockfd,newsockfd,portno;//为套接字和端口声明
/*TCP/IP协议上的简单服务器代码*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义长度512
无效错误(常量字符*消息)
{
佩罗尔(味精);
出口(1);
}
int main(int argc,char*argv[])
{
int sockfd,newsockfd,portno;//为套接字和端口声明变量
socklen\u t clilen;//客户端地址和端口号
字符缓冲区[长度];//消息缓冲区
serv_addr中的struct sockaddr_,cli_addr;//服务器和客户端地址的结构
int n;//检查侦听、接受、读取和写入过程是否完成
FILE*fileptr;//文件指针
int-datasize;
/*检查是否提供了端口号*/
如果(argc<2){
fprintf(stderr,“错误,未提供端口\n”);
出口(1);
}
/*创建套接字*/
sockfd=套接字(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
错误(“打开套接字时出错”);
bzero((char*)&serv_addr,sizeof(serv_addr));//清除服务器地址的内存
portno=atoi(argv[1]);//将中的portno从ASCII转换为整数
/*服务器地址和所有其他详细信息*/
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(端口号);
/*绑定套接字*/
如果(绑定(sockfd,(结构sockaddr*)和服务地址,
sizeof(服务地址))<0)
错误(“绑定错误”);
/*监听套接字并等待用户(最多5个)*/
听(sockfd,5);
clilen=sizeof(cli_addr);//客户端地址的大小
/*接受用户*/
newsockfd=accept(sockfd,(struct sockaddr*)&cli\u addr,&clilen);
if(newsockfd<0)
错误(“接受错误”);
/*文件操作*/
char*fs_name=“/home/ankur/Desktop/RTSIM_Dump.csv”;
fileptr=fopen(fs_name,“r”);//打开文件
/*对套接字的读写操作*/
bzero(缓冲区,长度);
而((datasize=fread(buffer,sizeof(char),length,fileptr))>0)
{
if(发送(newsockfd、缓冲区、数据大小、0)ai_next){
//创建用于连接到服务器的套接字
连接插座=插座(ptr->ai_系列,ptr->ai_插座类型,
ptr->ai_协议);
if(ConnectSocket==无效的_套接字){
printf(“套接字失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
//连接到服务器。
iResult=connect(ConnectSocket,ptr->ai_addr,(int)ptr->ai_addrlen);
if(iResult==SOCKET\u错误){
闭合插座(连接插座);
ConnectSocket=无效的_套接字;
继续;
}
打破
}
freeaddrinfo(结果);
if(ConnectSocket==无效的_套接字){
printf(“无法连接到服务器!\n”);
WSACleanup();
返回1;
}
//从服务器接收文件并保存它。
fileptr=fopen(“/Desktop/RTSIM_Dump.csv”,“w”);
if(fileptr==NULL)
{
printf(“错误:创建/打开文件”);
出口(1);
}
int write_sz;
memset(recvbuf,0,默认值);
而((recvbuflen=recv(ConnectSocket,recvbuf,DEFAULT_BUFLEN,0))>0)
{
write_sz=fwrite(recvbuf、sizeof(char)、recvbuflen、fileptr);
如果(写入_sz
------------------------------------------------------------------------------我在服务器(Ubuntu)上收到错误104&在服务器上创建/打开文件错误
窗户
提前感谢
我检查了Ubuntu上的服务器客户端,它工作得很好,但当我
在Windows客户端上尝试过。在执行过程中出现错误
这是不正确的windows路径。更合适的路径是“\Desktop\RTSIM\u Dump.csv”
。请注意,路径中的目录必须存在并具有适当的权限
服务器中的错误104是从哪里得到的
这是不正确的windows路径。更合适的路径是“\Desktop\RTSIM\u Dump.csv”
。请注意,路径中的目录必须存在并具有适当的权限
服务器上哪里有错误104?你的windows计算机上真的有
/Desktop
目录吗?我犯了一个愚蠢的错误。但在服务器端它仍然给出errno 104你的windows计算机上真的有/Desktop
目录吗?我犯了一个愚蠢的错误。但在服务器端它仍然给出errno 104(由对等方重置连接)最有可能出现在发送
(来自连接的客户端,但在接收任何内容之前,文件错误会立即消失)。是的,在服务器中,我收到错误号104。我按照建议对客户端代码进行了更改。它可以工作,但现在客户端只接收1.9KB。我的文件包含的数据超过了它。104(由对等方重置连接)最有可能出现在发送
(来自连接的客户端,但在接收任何内容之前,文件错误会立即消失)。是的,在服务器中,我收到错误号104。我按照建议对客户端代码进行了更改。它可以工作,但现在客户端只接收1.9 KB。我的文件包含的数据比它多。
/* Simple Server code on TCP/IP protocol */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <signal.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <netdb.h>
#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 <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
// 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;
}
fileptr = fopen("/Desktop/RTSIM_Dump.csv","w");