標籤:
首先是兩個程式,分別是socket的用戶端和服務端。(在windows系統vc6.0編譯)
伺服器端:
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET server; //伺服器socket
SOCKADDR_IN addrSrv;
char sendBuf[100];
char recvBuf[100];
SOCKADDR_IN addrClient;
SOCKET client; //串連的用戶端socket
int len;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
server=socket(AF_INET,SOCK_STREAM,0); //建立socket
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //設定地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); //設定連接埠號碼
bind(server,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //綁定
listen(server,5); //設定最多串連數
len=sizeof(SOCKADDR);
while(1)
{
client=accept(server,(SOCKADDR*)&addrClient,&len); //接收用戶端串連
sprintf(sendBuf,"Welcome %s ",
inet_ntoa(addrClient.sin_addr));
send(client,sendBuf,strlen(sendBuf)+1,0); //發送資訊用戶端
recv(client,recvBuf,100,0); //接收用戶端資料
printf("%s\n",recvBuf);
closesocket(client);
}
closesocket(client); //關閉串連
WSACleanup();
}
用戶端:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET sockClient; //用戶端socket
SOCKADDR_IN addrSrv;
char recvBuf[100];
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
sockClient=socket(AF_INET,SOCK_STREAM,0); //建立socket
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //串連伺服器端
recv(sockClient,recvBuf,100,0); //接收伺服器端資料
printf("%s\n",recvBuf);
send(sockClient,"hello world",strlen("hello world")+1,0); //向伺服器端發送資料
closesocket(sockClient); //關閉串連
WSACleanup();
}
以上兩個程式只需要簡單的改寫,就可以實現簡單的傳送檔案了。
將用戶端發送的資訊改為發送請求的檔案名稱。
send(sockClient,filename,strlen(filename)+1,0);
伺服器端接收到檔案名稱:
recv(client,filename,100,0);
伺服器端傳送檔案資訊:
if((fp=fopen(filename,"rb"))==NULL)closesocket(client); //請求的檔案不存在,則關閉串連
n=fread(sendBuf,1,100,fp);
while(n>0){
send(client,sendBuf,n,0); //傳送檔案用戶端
n=fread(sendBuf,1,100,fp);
}
用戶端則接收檔案資訊:
if((fp=fopen(filename,"wb"))==NULL)
{
return ;
}
while((ret=recv(sockClient,recvBuf,100,0))>0)
{
fwrite(recvBuf,1,ret,fp);
}
socket的用戶端和服務端(Windows控制台程式)