我正在尝试多线程程序...它的编译file.bind和accept函数也可以工作。但在打印“printf(”with thread%lu \ n“,(unsigned long int)threadID);”错误来自分裂错误。 从客户端我给文件名下载如果服务器端保持该文件打开该文件并发送到客户端我在HandleTCPClien函数中完成此操作。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//#include "Practical.h"
void DieWithError(char *errorMessage)
{
perror(errorMessage);
exit(1);
}
void DieWithUserMessage(const char *msg, const char *detail)
{
fputs(msg, stderr);
fputs(": ", stderr);
fputs(detail, stderr);
fputc('\n', stderr);
exit(1);
}
void DieWithSystemMessage(const char *msg)
{
perror(msg);
exit(1);
}
void *ThreadMain(void *threadArgs); //main program of Thread
// structure of arguments to pass to client thread
struct ThreadArgs
{
int clntSock; // Socket descriptor from client
};
int main(int argc, char *argv[])
{
if (argc != 2) // Test for correct number of arguments
DieWithUserMessage("Parameter(s)", "<Server Port>");
in_port_t servPort = atoi(argv[1]); // First arg: local port
int servSock; // Socket descriptor for server
// Create socket for incoming connections
servSock = SetupTCPServerSocket(argv[1]); // Socket descriptor for server
if (servSock < 0)
DieWithUserMessage("SetupTCPServerSocket() failed", "unable to establish");
for (;;)
{ // Run forever
int clntSock = AcceptTCPConnection(servSock); // new connection creates a client socket
// create separate memory for client argument
struct ThreadArgs *threadArgs = (struct ThreadArgs *) malloc(
sizeof(struct ThreadArgs));
if (threadArgs == NULL )
DieWithSystemMessage("malloc() failed");
threadArgs->clntSock = clntSock;
// create client thread
pthread_t threadID;
int returnValue = pthread_create(&threadID, NULL, ThreadMain, threadArgs);
if (returnValue != 0)
DieWithUserMessage("pthread_create() failed", strerror(returnValue));
printf("with thread %lu\n", (unsigned long int) threadID);
}
// NOT REACHED
}
void *ThreadMain(void *threadArgs)
{
// guranntees that thread resources are dellocated upon return
pthread_detach(pthread_self());
//extract socket file descriptor from argument
int clntSock = ((struct ThreadArgs *) threadArgs)->clntSock;
HandleTCPClient(clntSock);
}
void HandleTCPClient(int clntSocket)
{
FILE *fp;
char echoBuffer[200]; /* Buffer for echo string */
//char Buffer[2048]; /* Buffer for echo string */
echoBuffer[200] = '\0';
memset(echoBuffer, 0, sizeof(echoBuffer));
ssize_t recvMsgSize; /* Size of received message */
ssize_t numBytesSent;
/* Receive message from client */
if ((recvMsgSize = recv(clntSocket, echoBuffer, sizeof(echoBuffer), 0)) < 0)
DieWithError("recv() failed");
printf("Server asked file name from Client side:: %s\n", echoBuffer);
fp = fopen(echoBuffer, "r"); //open the file
if (fp)
{
while (fgets(echoBuffer, sizeof(echoBuffer), fp))
{
//usleep(200*1000);
printf("%s\n", echoBuffer);
numBytesSent = send(clntSocket, echoBuffer, strlen(echoBuffer), 0);
}
if (numBytesSent < 0)
DieWithSystemMessage("send() failed");
else if (numBytesSent != strlen(echoBuffer))
DieWithUserMessage("send()", "sent unexpected number of bytes");
}
if (!fp)
{
printf("\nit failed!\n");
//return 1;
}
recvMsgSize = 0; //exit connection of this client
fclose(fp);
close(clntSocket); /* Close client socket */
}