1、C語言Socket伺服器怎麼給客戶端發消息
你的文件中的問題
// 會阻塞進程,直到有客戶端連接上來為止
// 既然是直到有客戶端連接上,那麼就要弄明白哪個是與客戶端連接的套接字
// sockClient就是與客戶端連接的套接字
sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len);
//接收並列印客戶端數據
recv(sockClient, recvBuf, 100, 0);
printf("%s\n", recvBuf);
// 所以此處,應該把sockServer改為sockClient
send(/*sockServer*/sockClient, sendBuf, 100, 0);
PS:伺服器客戶端通信,是要保持伺服器與客戶端的連接。
而不能這樣立即關閉,如果設置不對,立即關閉,緩沖區的數據是會丟失的。那客戶端也就不會再收到數據了。
你可以加Sleep(10000);來測是通信過程
//關閉socket
closesocket(sockClient);
2、C/S多個客戶端直接連接伺服器的資料庫如何進行並發操作呢
資料庫作為伺服器軟體,支持客戶端的並發操作是必須的功能啊,客戶端不用考慮哦。
資料庫引擎有一系列的辦法來支持多用戶的並發的,包括鎖、序列化、緩沖區等等。
3、基於c語言,網路編程,伺服器接收客戶端1的信息發送給客戶端2
char buff2[1024*10];
int receiveLen;
/*調用accept函數,等待客戶端的連接*/
client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size
/*調用recv函數接收客戶端的請求*/
recvbytes=recv(client_fd,buf,BUFFER_SIZE,0)
typedef int (WINAPI ICEPUB_TCPSENDANDRECEIVETEXT)(char *sendBuff, int sendBuffLen,char *recvBuff,int recvMaxLen,char* serverIP,int serverPort);
ICEPUB_TCPSENDANDRECEIVETEXT *icePub_tcpSendAndReceiveText = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_tcpSendAndReceiveText=(ICEPUB_TCPSENDANDRECEIVETEXT *)GetProcAddress(hDLLDrv,"icePub_tcpSendAndReceiveText");
}
if(icePub_tcpSendAndReceiveText)
receiveLen=icePub_tcpSendAndReceiveText(buf,recvbytes),buff2,1024*10,"192.168.1.2",8000);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
AfxMessageBox(buff2);
4、C語言socket編程要怎麼實現伺服器可以發消息給客戶端?
先要理解socket是什麼?
簡單的說socket是一個全雙工的通信通道,
即使用TCP或者UDP通信時均可以在發送消息的同時接受消息,
它不區分是否是伺服器。
根據這個概念你的問題就很好回答。
》當客戶端與伺服器連接後。有什麼方法使伺服器可以隨時隨地發消息給客戶端?
》我現在只能。客戶端發個消息給伺服器。伺服器才能發個消息給客戶端。也就是說客戶端不發消息。伺服器就沒法發消息給客戶端。
》求大牛給個思路。當連接後。客戶端與伺服器雙方可以隨時隨地通信!
使用多線程,一個維持接受邏輯,一個維持送信邏輯,即可完成同時接受及發送。
客戶端及伺服器端均做上述設置。
而你的做法是在一個線程中執行接受與送信,因此只能按照順序邏輯完成接收與送信。
關鍵點是多線程。
5、linux c socket 客戶端循環十次向伺服器發送數據(tcp連接),為啥只能接受第一次的?求代碼
只是做這些動作的話不需要多線程
找了下以前寫的 改成了你說的10次發送
client.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main(int argc,char **argv)
{
char wbuf[] = "hello server";
char rbuf[128];
int i;
int sock;
struct sockaddr_in server = {0};
struct timeval timeo;
timeo.tv_sec = 0;
timeo.tv_usec = 1000 * 1000; //
socklen_t len = sizeof(timeo);
if( argc != 2)
{
printf("usage: ./client <ipaddress>\n");
return -1;
}
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("Create TCP Socket");
return -1;
}
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeo, len);
server.sin_family = AF_INET;
server.sin_port = htons(30000);
inet_pton(AF_INET, argv[1], &(server.sin_addr));
int res = connect(sock, (struct sockaddr*)&server, sizeof(server));
if (res < 0)
{
if(res == EINPROGRESS)
perror("connecting stream socket time out:");
else
perror("connecting stream socket error:");
close(sock);
return -1;
}
else
{
printf("Connect Server@%s\n",argv[1]);
for(i=0;i<10;i++)
{
int wsize = send(sock,wbuf,sizeof(wbuf),0);
if(wsize<=0)
{
perror("write error:");
close(sock);
return -1;
}
printf("1111111i=%d\n",i);
while(1)
{
int rsize=recv(sock,rbuf,sizeof(rbuf),0);
if(rsize>0)
{
rbuf[rsize]='\0';
printf("recv msg from server: %s\n",rbuf);
break;
}
if(rsize<0)
{
close(sock);
perror("read error:");
return -1;
}
}
}
close(sock);
return 0;
}
}
server.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr = {0};
char rbuf[128];
char wbuf[] = "hello client";
int n;
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("Create TCP Socket");
return -1;
}
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(30000);
if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind socket error:");
return -1;
}
if( listen(listenfd, 10) == -1)
{
perror("listen socket error:");
return -1;
}
printf("======waiting for client's request======\n");
while(1)
{
if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
{
perror("accept socket error:");
continue;
}
while(1)
{
n = recv(connfd, rbuf, sizeof(rbuf), 0);
if(n>0)
{
rbuf[n] = '\0';
printf("recvmsg from client: %s\n", rbuf);
n = send(connfd, wbuf, sizeof(wbuf),0);
if(n<=0)
{
perror("sned error:");
close(connfd);
break;
}
}
else if(n < 0)
{
perror("recv error:");
close(connfd);
break;
}
}
close(connfd);
}
close(listenfd);
return 0;
}
運行的時候 client
./client 你的serverip
埠我用的30000 寫死在程序里了
6、C/S系統客戶端如何與伺服器連接
一般是連接資料庫伺服器,以連接SQLSERVER為例,需要NEW一個SQLConnect,然後賦值連接參數,最後打開這個連接就好了。
連接參數示例如下:
Provider=SQLOLEDB.1; #連接資料庫的驅動程序,SQL Server是 SQLOLEDB.1
Password="******"; #登錄口令
User ID=sa; #登錄ID
Initial Catalog=xxxxxx; #資料庫名稱
Data Source=192.168.10.2 #SQLSERVER伺服器名或IP地址
7、請問c語言socket編程客戶端如何與客戶端通信的啊
我告你個思路,就像是我想實現的QQ功能一樣。
建立一個伺服器Server,它用來負責轉發消息。
A,B,C都是客戶端
A想發送消息給B,就給Server發送(A,[B],"我是A,這是我給B的消息。"),Server收到後根據[B]將消息內容轉發給B;
A想給B,C發送群消息,就給Server發送(A,[B,C],"我是A,這是我給B和C發送的消息。"),Server收到後根據[B,C]將消息內容轉發給B和C。
Server想要給A,B,C都發送一條消息,必須都建立好連接後,分別給他們發送同一條消息。
伺服器開啟後,監聽socket連接,一旦有socket連接例如A請求連接,就把它交給一個線程例如SA去處理,然後它繼續監聽。SA線程就只負責處理Server和客戶端A之間的消息。
同理,SB線程就只負責處理Server和客戶端B之間的消息,SC線程就只負責處理Server和客戶端C之間的消息。
伺服器有一個方法transpond(String from,String[] to,String message),處理轉發消息。SA,SB,SC調用這個方法去實現通信。
8、C語言socket編程怎麼實現2個客戶端之間通信
如果只是兩個客戶端和一個伺服器,可通過伺服器轉發即可,兩個客戶端連接到伺服器,伺服器把從A接收到的發給B,把從B接收到的發給A即可,如果要做成多個客戶端的,則要給各個客戶端分配ID,服務端好根據各個客戶端和消息要轉發送給客戶端的ID來確定消息發送對象。
9、C用一個socket實現一個伺服器接收兩個客戶端的信息並保存
服務端監聽socket正常是不與任何客戶端socket進行通信的。監聽socket死循環作監聽工作,當收到一個連接之後,創建一個新的socket來與客戶端通信。這樣理論上一個服務端可以與上萬的客戶端通信。只是要記住,每個真正參與通信的socket都需要開兩個單獨的線程來進行消息的收發。
10、用c/s做的客戶端怎麼訪問伺服器
可以通過直接訪問伺服器端資料庫完成。不過在訪問的過程中,為了安全考慮。可以先將客戶端發送的數據轉碼或者加密。然後到伺服器端後解密或者再轉碼。管理員可以通過B/S程序完成查看功能。C/S和B/S用同一個庫就可以了。如果連的是外網,就要考慮很多安全因素。