求socket大神帮我把这服务端和用户端的字符串传输形式改成文件的,就接收和发送的函数变成发送文件的函数
client端代码
#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 <unistd.h>
void* sendMsg(void * socket)
{
int sock = *((int*)socket);
while(1){
char msg[4096];
memset(msg,0, sizeof(msg));
gets(msg);
size_t outputlength = strlen(msg);
// ssize_t bytecount = send(sock, msg, outputlength, 0);//发送消息
if (send(sock, msg, outputlength, 0)< 0) {
printf("send failed\n");
}
}
}
void* recvMsg(void * socket)
{
int sock = *((int*)socket);
while(1){
char msg[4096];
memset(msg, 0, sizeof(msg));
//ssize_t bytecount = recv(sock, msg, sizeof(msg), 0); //接收消息
if (recv(sock, msg, sizeof(msg), 0) >0) {
puts(msg);
//printf("recv:%d",msg);
}
} }
int main(int argc,char * argv[])
{ pthread_t recv;
pthread_t send;
int port = 7777;
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//AF_INET指明使用ipv4,sock_stream指定使用流套接字,ipproto_tcp指定使用tcp协议
if (sock < 0) {
printf("socket error\n");
}
struct sockaddr_in servAddr;//结构体用于存放地址
memset(&servAddr, '\0', sizeof(struct sockaddr_in));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(argv[1]);
servAddr.sin_port = htons(port);
printf("servAddr=%#x,port=%#x\r\n",servAddr.sin_addr.s_addr,servAddr.sin_port);
if (servAddr.sin_addr.s_addr == 0) {
printf("address wrong ,inet_pton() failed\n");
}
else
if (servAddr.sin_addr.s_addr < 0) {
printf("inet_pton() failed");
}
if(connect(sock, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0)//连接到服务器
{
printf("connect failed\n");
}
printf("connect ok!\r\n");
pthread_create(&recv, NULL, recvMsg, &sock);
pthread_create(&send, NULL, sendMsg, &sock);
pthread_join(recv, 0);
pthread_join(recv, 0);
close(sock);
}
server端代码
#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 <unistd.h>
#include <pthread.h>
void* receiveMsg(void *sock)
{
char buffer[4096];
int* socket = (int*)sock;
while (1) {
memset(buffer,0,sizeof(buffer));
ssize_t byteCount = recv(*socket, buffer, 4096, 0);
if(byteCount <= 0) {
continue;
}
puts(buffer);
}
}
void* sendMsg(void* sock)
{
while (1) {
usleep (500);
char buffer[4096];
memset(buffer, 0, sizeof(buffer));
gets(buffer);
//scanf("% c",&buffer);
if(strlen(buffer) < 0)
{
continue;
}
ssize_t byteCount = send(*(int*)sock, buffer, 4096, 0);
if(byteCount < 0)
{
printf("send failed\n");
}
}
}
int main()
{
pthread_t sendPthread;
pthread_t recvPthread;
in_port_t servPort = 7777;
int servSock;
if ((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)//创建socket
{
printf ("socket error\n");
}
struct sockaddr_in servAddr;
memset(&servAddr, '\0', sizeof(struct sockaddr_in));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);//让系统自动填充地址,不用自己去查明本机的地址是多少
servAddr.sin_port = htons(servPort);
if(bind(servSock, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0) //把套接字绑定到 指定的地址与端口
{
printf("bind error\n");
}
printf("bind ok\n");
if(listen(servSock, 5)< 0)//开始监听,等待客户 端的连接,listen调用之前,客户端无法连接到服务端第二个参数为最大连接数
{
printf("listen filed\n");
}
printf("listen ok\n");
struct sockaddr_in clntAddr;
socklen_t clntAddrLen = sizeof(clntAddr);
int clntSock = accept(servSock, (struct sockaddr*)&clntAddr, &clntAddrLen);
if (clntSock < 0)
{
//cout << "accept error" << endl;
printf("accept error\n");
}
char clntName[1024];
if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName, sizeof (clntName)) != NULL) {
puts(clntName);
printf("port:%d",ntohs(clntAddr.sin_port));
}
else {
printf("client address get failed\n");
}
pthread_create (&sendPthread, NULL, sendMsg, &clntSock);
pthread_create (&recvPthread, NULL, receiveMsg, &clntSock);
pthread_join (sendPthread, 0);
pthread_join(recvPthread, 0);
}
学校的作业 就是用socket网络编程在单片机上实现信息传递,但是这个只实现了字符串,我需要把他变成传输文件的,我本身实在是经验不足,道行太浅 希望大神帮我把里面的接受和发送函数直接改成收发文件的,感激不尽。